synchronize锁优化

  • Post author:
  • Post category:其他


不管学什么东西,都要明白为什么

为什么需要锁优化?

因为java程序在挂起唤醒线程的时候需要从用户态切换到内核态,这是非常消耗资源的。


1,自旋锁与自适应自旋


在JDK  1.6中引入了自适应的自旋锁。自适应意味着自旋的时间不再固定了,而是由前

一次在同一个锁上的自旋时间及锁的拥有者的状态来决定。如果在同一个锁对象上,自旋等

待刚刚成功获得过锁,并且持有锁的线程正在运行中,那么虚拟机就会认为这次自旋也很有

可能再次成功,进而它将允许自旋等待持续相对更长的时间,比如100个循环。另外,如果

对于某个锁,自旋很少成功获得过,那在以后要获取这个锁时将可能省略掉自旋过程,以避

免浪费处理器资源。有了自适应自旋,随着程序运行和性能监控信息的不断完善,虚拟机对

程序锁的状况预测就会越来越准确,虚拟机就会变得越来越“聪明”了。


2,锁消除


锁消除是指虚拟机即时编译器在运行时,对一些代码上要求同步,但是被检测到不可能

存在共享数据竞争的锁进行消除。锁消除的主要判定依据来源于逃逸分析的数据支持(第11

章已经讲解过逃逸分析技术),如果判断在一段代码中,堆上的所有数据都不会逃逸出去从

而被其他线程访问到,那就可以把它们当做栈上数据对待,认为它们是线程私有的,同步加

锁自然就无须进行。


3,锁粗化


把多个小锁改成一个大锁


4,轻量级锁


采用自旋来获取锁,比较占用cpu资源但是不会挂起


5,偏向锁


偏向某个线程,记录一个线程id,这个线程在获取这个锁的时候不需要获取或者释放锁


6,重量级锁


轻量级锁膨胀后成为重量级锁,在获取锁的时候直接挂起,不自旋