不管学什么东西,都要明白为什么
为什么需要锁优化?
因为java程序在挂起唤醒线程的时候需要从用户态切换到内核态,这是非常消耗资源的。
1,自旋锁与自适应自旋
在JDK 1.6中引入了自适应的自旋锁。自适应意味着自旋的时间不再固定了,而是由前
一次在同一个锁上的自旋时间及锁的拥有者的状态来决定。如果在同一个锁对象上,自旋等
待刚刚成功获得过锁,并且持有锁的线程正在运行中,那么虚拟机就会认为这次自旋也很有
可能再次成功,进而它将允许自旋等待持续相对更长的时间,比如100个循环。另外,如果
对于某个锁,自旋很少成功获得过,那在以后要获取这个锁时将可能省略掉自旋过程,以避
免浪费处理器资源。有了自适应自旋,随着程序运行和性能监控信息的不断完善,虚拟机对
程序锁的状况预测就会越来越准确,虚拟机就会变得越来越“聪明”了。
2,锁消除
锁消除是指虚拟机即时编译器在运行时,对一些代码上要求同步,但是被检测到不可能
存在共享数据竞争的锁进行消除。锁消除的主要判定依据来源于逃逸分析的数据支持(第11
章已经讲解过逃逸分析技术),如果判断在一段代码中,堆上的所有数据都不会逃逸出去从
而被其他线程访问到,那就可以把它们当做栈上数据对待,认为它们是线程私有的,同步加
锁自然就无须进行。
3,锁粗化
把多个小锁改成一个大锁
4,轻量级锁
采用自旋来获取锁,比较占用cpu资源但是不会挂起
5,偏向锁
偏向某个线程,记录一个线程id,这个线程在获取这个锁的时候不需要获取或者释放锁
6,重量级锁
轻量级锁膨胀后成为重量级锁,在获取锁的时候直接挂起,不自旋