并发编程(02)---- 认识*锁和基本信息

1、活跃性问题

      死锁

      饥饿

      活锁

2、时间片:

       多线程的时候,cpu会给每个线程一个时间片,但是时间片很短,可能线程还没执行完时间就过期了,的让出cpu给其他线程使用,为了保持这个线程下次还没继续完成任务,还的保存线程的运行数据,也是很消耗性能的

3、饥饿与公平

    高优化级的吞噬所有低优先级的CPU时间片

    线程被永久堵塞在一个等待进入同步块的状态

    等待的线程永远不被唤醒

    如何避免饥饿问题

         t1.setPriority(10); 设置线程优先级,win最小为1,大为10

        设置合理的优先级

         使用锁来代替synchronize

           当几个线程同时对一个变量进行操作时,A线程执行了加,但是还没有赋值,时间片被B线程抢了过去,又对这个变量进行加,结果A线程和B线程的计算得到的值是一样的

4、线程安全性问题

     多线程环境下

     多个线程共享一个资源

     对资源进行非原子性操作

5、Synchronize的原理和使用

    内置锁

     互斥锁

 

修饰普通方法

修饰静态方法

并发编程(02)---- 认识*锁和基本信息

 

6、任何对象都可以作为锁,那么锁信息又存在什么地方呢?

      (1)存在对象头中

      (2)对象头中的信息

           Mark Word (锁关注的地方)

            Class Metadata Address

            Array Length

7、偏向锁(获取锁资源不释放,当别的线程来尝试访问的时候才会释放锁)

      每次获取锁和释放锁会浪费资源

      很多情况下,竞争锁不是由多个线程,而是由一个线程在使用

       只有一个线程在访问同步代码块的场景

       在偏向锁状态时

             线程ID

             Epoch

             对象的分代年龄信息

             是否是偏向锁

             锁标志位

8、轻量级锁

     自旋

     多线程可以同时

 

重量级锁