每当关于Java同步的问题浮出水面时,有些人就会很想指出synchronized(this)
应该避免的事情。他们声称,取而代之的是,最好是锁定私有引用。
给出的一些原因是:
- 一些邪恶的代码可能会窃取您的锁(非常流行,也有一个“偶然的”变体)
- 同一类中的所有同步方法都使用完全相同的锁,这会降低吞吐量
- 您(不必要地)暴露了太多信息
包括我在内的其他人则认为,这synchronized(this)
是一个惯用语言(在Java库中也是如此),是安全且易于理解的。应当避免这种情况,因为您有一个错误,而且对多线程程序中正在发生的事情一无所知。换句话说:如果适用,请使用它。
我对看到一些真实的示例(没有foobar的东西)感兴趣,在这种情况下,避免锁定this
也更可取synchronized(this)
。
因此:您是否应该始终避免synchronized(this)
使用私有引用锁定并将其替换?
一些进一步的信息(根据给出的答案进行更新):
- 我们正在谈论实例同步
- 的隐式(
synchronized
方法)和显式形式synchronized(this)
都被考虑 - 如果您引用Bloch或有关该主题的其他权威,请不要遗漏您不喜欢的部分(例如,Effective Java,Thread Safety上的项目:通常是实例本身的锁,但也有例外)。
- 如果您需要锁定而不是
synchronized(this)
提供粒度,synchronized(this)
则不适用,所以这不是问题