ITPub博客

首页 > IT职业 > IT职场 > synchronized在java中的优化方法

synchronized在java中的优化方法

IT职场 作者:jenliang 时间:2021-09-11 10:03:00 0 删除 编辑

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

1.锁优化

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

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

2.锁消除

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

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

public void vectorTest(){
   Vector<String> vector = new Vector<String>();
   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的实际操作中了。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4565/viewspace-2831291/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: js boolean判断
请登录后发表评论 登录
全部评论

注册时间:2019-07-15

  • 博文量
    189
  • 访问量
    858