Java: 锁重入对性能影响有多大?

 

问题描述:

如下,commonDo可能被多个方法(有可能不同步的)调用,在specialDo调用commonDo会重入锁,对性能影响大吗?
是不是最好把commonDo()的代码直接放在specialDo里比较好?虽然代码冗余,但是性能好?

class MyClass{
    public synchronized void specialDo(){
       ...
       commonDo();
    }

    public synchronized void commonDo(){
       ...
    }
}

 

第 1 个答案:

重进锁仅仅在基数 +1,性能影响基本可以忽略。类似的做法,可以参考ReentrantLock


 

第 2 个答案:

synchronized底层是通过monitorenter 和 monitorexit指令来实现的。具体介绍推荐此文
synchronized可重入的机理,只是在内部判断一下当前线程是否具有锁住对象的monitor权限,如果当前线程已经拥有了,则只是简单地作计数+1。所以锁是否重入并不影响性能。


 

第 3 个答案:

这个方法上的锁有用吗?如果每个线程都会创建一个对象,锁是没有任何用处的


我在新版的vue-cli 打包以后webkit内涵的浏览器都支持es6语法,我看一些文字说现在vue-cli脚手架都集成了es6转es5但是现在的问题是打包完以后报错语法不支持。.ba ...