在 Java 中,在代码中声明临界区的惯用方法如下:
private void doSomething() {
// thread-safe code
synchronized(this) {
// thread-unsafe code
}
// thread-safe code
}
几乎所有块都同步this
,但这有什么特殊原因吗?还有其他的可能性吗?关于同步哪些对象有任何最佳实践吗? (例如私有实例Object
?)
正如前面的回答者所指出的,最佳实践是在有限范围的对象上进行同步(换句话说,选择您可以摆脱的最严格的范围,然后使用它。)特别是,同步this
这是一个坏主意,除非您打算允许您的班级的用户获得锁定。
但是,如果您选择在java.lang.String
。字符串可以(并且在实践中几乎总是)被保留。这意味着每个字符串的内容相同 - 在整个 JVM- 事实证明幕后是同一个字符串。这意味着,如果您在任何字符串上进行同步,另一个(完全不同的)代码段也锁定具有相同内容的字符串,实际上也会锁定您的代码。
我曾经对生产系统中的死锁进行故障排除,并且(非常痛苦地)将死锁跟踪到两个完全不同的开源包,每个包在一个 String 实例上同步,其内容都是"LOCK"
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)