1:请讲一下synchronized
锁的升级过程
答:无锁 --> 偏向锁 --> 轻量级锁 --> 重量级锁
偏向锁
:只有一个线程争抢锁资源的时候,将线程拥有者标识为当前线程。
轻量级锁(自旋锁)
:一个或多个线程通过CAS去争抢锁,如果抢不到则一直自旋。
重量级锁
:多个线程争抢锁,向内核申请锁资源,将未争抢成功的锁放到队列中直接阻塞。
2:什么情况下偏向锁才会升级为轻量级锁
答:只有一个线程的时候就是偏向锁(当偏向锁开启的时候,偏向锁默认开启);当争抢的线程超过一个,升级为轻量级锁。其实轻量级锁就适用于那种执行任务很短的线程,可能通过一两次自旋,就能够获取到锁。
3.什么时候轻量级锁才会升级为重量级锁
答:当自旋的线程循环超过10次,或者线程等待的数量超过cpu的1/2,升级为重量级锁。
4.开启偏向锁一定比轻量级锁高效吗
答:不一定,比如在一开始已经知道某个资源就需要被多个线程争抢,此时就不需要开启偏向锁,因为偏向锁给了标识之后,还需要取消这个标识,重新抢锁,比如在JVM中,偏向锁默认是延迟4秒才开始的,因为JVM在启动的时候需要多个线程竞争资源,并且这个都是一开始知道的。