请稍等 ...
×

采纳答案成功!

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

StringBuffer锁粗化与锁消除

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

正在回答

1回答

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

      StringBuffer sb = new StringBuffer();

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

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

0 回复 有任何疑惑可以回复我~
  • 提问者 小布鲁斯韦恩 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2019-12-29 20:53:05
  • 老师好,为什么StringBuffer设置成成静态的成员变量,就会出现锁粗化了呢?
    回复 有任何疑惑可以回复我~ 2020-05-12 23:50:21
  • 翔仔 回复 莨菽菽 #3
    因为可能会被多个线程共享,所以得加锁,而又不需要反复加锁,所以会粗化
    回复 有任何疑惑可以回复我~ 2020-05-13 21:10:31
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信