synchronized在java中的优化方法

synchronized在java中的优化方法,第1张

synchronized在java中的优化方法

我们使用锁的四种状态,能够在一定程度上弥补synchronized的不足。除了之前讲过的几种锁外,今天进一步为大家带来其它几种锁优化的方法:锁消除、锁粗化、自旋锁与自适应自旋锁。通过这些方法,也能够实现对锁 *** 作的进一步优化,下面就来一起看看这些锁优化的使用吧。

1.锁优化

jdk1.6对锁的实现引入了大量的优化,如自旋锁、适应性自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等技术来减少锁 *** 作的开销。

锁主要存在四种状态,依次是:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态。

2.锁消除

锁消除即删除不必要的加锁 *** 作。虚拟机即时编辑器在运行时,对一些“代码上要求同步,但是被检测到不可能存在共享数据竞争”的锁进行消除。

根据代码逃逸技术,如果判断到一段代码中,堆上的数据不会逃逸出当前线程,那么可以认为这段代码是线程安全的,不必要加锁。

public void vectorTest(){
   Vector vector = new Vector();
   for(int i = 0 ; i < 10 ; i++){
     vector.add(i + "");
   }
 
   System.out.println(vector);
 }

3.锁粗化

锁粗化是虚拟机对另一种极端情况的优化处理,通过扩大锁的范围,避免反复加锁和释放锁。比如下面method3经过锁粗化优化之后就和method4执行效率一样了。

public class StringBufferTest {
    StringBuffer stringBuffer = new StringBuffer();
 
    public void append(){
        stringBuffer.append("a");
        stringBuffer.append("b");
        stringBuffer.append("c");
    }
}

4.自旋锁与自适应自旋锁

轻量级锁失败后,虚拟机为了避免线程真实地在 *** 作系统层面挂起,还会进行一项称为自旋锁的优化手段。

(1)自旋锁

所谓自旋锁,就是让该线程等待一段时间,不会被立即挂起,看持有锁的线程是否会很快释放锁。怎么等待呢?执行一段无意义的循环即可(自旋)。

(2)自适应自旋锁

相当于是对上面自旋锁优化方式的进一步优化,它的自旋的次数不再固定,其自旋的次数由前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定,这就解决了自旋锁带来的缺点。

以上就是synchronized在java中的优化方法,我们可以根据自己想要对锁优化的程度,选择不同的方法去 *** 作。学会之后,就可以运用到synchronized的实际 *** 作中了。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/3017607.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-28
下一篇 2022-09-28

发表评论

登录后才能评论

评论列表(0条)

保存