synchronize锁优化

来源:互联网 发布:主人网络与访客网络 编辑:程序博客网 时间:2024/06/09 23:46

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

为什么需要锁优化?

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


 1,自旋锁与自适应自旋

在JDK  1.6中引入了自适应的自旋锁。自适应意味着自旋的时间不再固定了,而是由前
一次在同一个锁上的自旋时间及锁的拥有者的状态来决定。如果在同一个锁对象上,自旋等
待刚刚成功获得过锁,并且持有锁的线程正在运行中,那么虚拟机就会认为这次自旋也很有
可能再次成功,进而它将允许自旋等待持续相对更长的时间,比如100个循环。另外,如果
对于某个锁,自旋很少成功获得过,那在以后要获取这个锁时将可能省略掉自旋过程,以避
免浪费处理器资源。有了自适应自旋,随着程序运行和性能监控信息的不断完善,虚拟机对
程序锁的状况预测就会越来越准确,虚拟机就会变得越来越“聪明”了。

2,锁消除

锁消除是指虚拟机即时编译器在运行时,对一些代码上要求同步,但是被检测到不可能
存在共享数据竞争的锁进行消除。锁消除的主要判定依据来源于逃逸分析的数据支持(第11
章已经讲解过逃逸分析技术),如果判断在一段代码中,堆上的所有数据都不会逃逸出去从
而被其他线程访问到,那就可以把它们当做栈上数据对待,认为它们是线程私有的,同步加
锁自然就无须进行。

3,锁粗化

把多个小锁改成一个大锁

4,轻量级锁

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

5,偏向锁

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

6,重量级锁

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







原创粉丝点击