StringBuffer锁粗化与锁消除
来源:9-3 synchronized底层实现原理-2
小布鲁斯韦恩
2019-12-28
老师,锁粗化那段也用的StringBuffer的例子,这里JIT编译不会进行锁消除的原因是因为copyString100Times的返回值是sb.toString吗?
这里的sb也是局部变量(本地变量),即使有返回值,各个线程之间也不会共享到sb吧,不共享为什么不进行锁消除?那么锁消除的条件具体是哪些呢?
望老师解答o(~~)o
写回答
1回答
-
同学好,抱歉这里锁粗化的例子举得不是很贴切,
StringBuffer sb = new StringBuffer();
这个StringBuffer应该也设置成静态的成员变量,才会出现锁粗化,毕竟 copyString100Times 这个方法所有线程调用返回值都是一样的。
然后锁消除的条件具体得看JIT,一般它会判断是否是局部变量,即会分析不加锁和加锁执行的结果如果是一致的话,才能进行锁消除。
032020-05-13
相似问题