锁消除和锁粗化都是append方法,没看出来有什么不同呢?

来源:9-3 synchronized底层实现原理-2

慕仰5417450

2020-03-15

写回答

1回答

翔仔

2020-03-16

具体可以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
7
慕哥6062902
回复
翔仔
谢谢翔仔老师
2020-08-12
共7条回复

剑指Java面试-Offer直通车 百度资深面试官授课

招聘季即将到来,让百度资深面试官来为你的高薪Offer保驾护航

8426 学习 · 1870 问题

查看课程