锁在jdk16之后的优化是什么?
JDK1.6之后的锁优化包括以下几方面:
-
自适应自旋(Adaptive Spinning):在多线程竞争的情况下,如果某个线程获取到锁后很快就释放了锁,那么其他线程也就不需要再进行竞争了,这时候就采用自适应自旋的方式,让其他线程进行自旋等待,提高程序的并发性能。
-
锁消除(Lock Elimination):通过分析代码,发现某些锁根本没有竞争,可以安全地消除掉,这样可以减少锁带来的性能开销。
-
偏向锁(Biased Locking):在程序启动后,对象的锁标记默认是未锁定状态,当某个线程访问该对象并获取到锁时,就会将对象的锁标记设置为偏向锁,以后其他线程再访问该对象时,就可以直接获取到偏向锁,避免了无谓的竞争,提高了程序的并发性能。
-
轻量级锁(Lightweight Locking):当某个线程获取到锁后,如果该锁没有被其他线程占用,就会将对象的锁标记设置为轻量级锁,这时候其他线程访问该对象时,只需要进行自旋等待即可,避免了线程的阻塞和唤醒操作,提高了程序的并发性能。
-
适应性自旋锁(Adaptive Spinning Lock):在多线程竞争的情况下,如果某个线程获取到锁后很快就释放了锁,那么其他线程也就不需要再进行竞争了,这时候就采用适应性自旋锁的方式,让其他线程进行自旋等待的时间逐步增加,直到达到一定的时间限制后就会进行阻塞等待,避免了无谓的自旋等待,提高了程序的并发性能。
原文地址: https://www.cveoy.top/t/topic/bgKE 著作权归作者所有。请勿转载和采集!