StringBuffer锁粗化与锁消除

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

小布鲁斯韦恩

2019-12-28

老师,锁粗化那段也用的StringBuffer的例子,这里JIT编译不会进行锁消除的原因是因为copyString100Times的返回值是sb.toString吗?
这里的sb也是局部变量(本地变量),即使有返回值,各个线程之间也不会共享到sb吧,不共享为什么不进行锁消除?那么锁消除的条件具体是哪些呢?
望老师解答o(~~)o

写回答

1回答

翔仔

2019-12-28

同学好,抱歉这里锁粗化的例子举得不是很贴切,

      StringBuffer sb = new StringBuffer();

这个StringBuffer应该也设置成静态的成员变量,才会出现锁粗化,毕竟      copyString100Times 这个方法所有线程调用返回值都是一样的。

然后锁消除的条件具体得看JIT,一般它会判断是否是局部变量,即会分析不加锁和加锁执行的结果如果是一致的话,才能进行锁消除。

0
3
翔仔
回复
莨菽菽
因为可能会被多个线程共享,所以得加锁,而又不需要反复加锁,所以会粗化
2020-05-13
共3条回复

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

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

8426 学习 · 1870 问题

查看课程