请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

正在回答 回答被采纳积分+3

1回答

翔仔 2020-03-16 00:57:36

具体可以javap看看两段代码的异同就知道了

public class StringBufferWithoutSync {
    public void add(String str1, String str2) {
        //StringBuffer是线程安全,由于sb只会在append方法中使用,不可能被其他线程引用
        //因此sb属于不可能共享的资源,JVM会自动消除内部的锁
        StringBuffer sb = new StringBuffer();
        sb.append(str1).append(str2);
    }

    public static void main(String[] args) {
        StringBufferWithoutSync withoutSync = new StringBufferWithoutSync();
        for (int i = 0; i < 1000; i++) {
            withoutSync.add("aaa", "bbb");
        }
    }
}

前者不加锁

public class CoarseSync {
    public static String copyString100Times(String target){
        int i = 0;
        StringBuffer sb = new StringBuffer();
        while (i<100){
            sb.append(target);
        }
        return sb.toString();
    }
}

后者会只加一次锁

0 回复 有任何疑惑可以回复我~
  • 老师,我感觉第二个锁粗化的例子,其实用锁消除的优化也一样可以,或者说其实所有StringBuffer都直接用锁消除来优化就可以了,这么理解有问题么?
    回复 有任何疑惑可以回复我~ 2020-05-12 19:19:17
  • 翔仔 回复 莨菽菽 #2
    同学好,StringBuffer append了多次,锁实际上有一次,所以还是有锁的,并未消除
    回复 有任何疑惑可以回复我~ 2020-05-12 21:07:50
  • 莨菽菽 回复 翔仔 #3
    老师好,我想表达的意思是,append方法既然在jit的时候都消掉了syn标记,第二个例子的sb也是本地变量不会被其他线程引用,所有我觉得第二个例子jvm也会进行锁消除,虽然是锁粗化的例子,但是可能实际jvm选择了锁消除优化,不知道这么理解对不对
    回复 有任何疑惑可以回复我~ 2020-05-12 22:11:34
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信