我写一些这样的代码:
public static void function7() {
String str = "123";
String str2 = "123";
synchronized (str) {
if(str != null) {
str2 = "123";
}else{
str = "456";
}
System.out.println(str2);
}
}
代码编译良好。但是Eclipse的一个插件,查找错误,给出以下错误报告:
常量字符串在JVM加载的所有其他类中进行实习和共享。因此,这可能会锁定其他代码也可能锁定的内容。这可能会导致非常奇怪且难以诊断的阻塞和死锁行为。
到底是什么意思?
字符串文字是不可变的,并通过VM的字符串池共享。这意味着,例如,每次编写时,不会在堆上放置"foo"
新的String表示foo
。结果,该字符串池对所有线程可见。然后,在String文字上进行同步会使您暴露于非结构化同步,这是死锁地狱火车的第一站。
高效共享字符串是为什么不应该将带签名的String构造函数与String(String)一起使用的原因,除非您确实有这样做的充分理由。
另外,在本地变量上同步也没有意义,因为在方法之外没有可见性,更不用说在其他线程中了。
最后,您真的需要同步吗?由于您在上面的代码中没有有效地使用它,即使排除了字符串问题,也有可能不必使用它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句