避免在Java中同步(这个)?
每当出现关于Java同步的问题时,一些人都非常想指出synchronized(this)
应该避免。相反,他们声称,私有引用上的锁是首选的。
提出的一些理由如下:
其他人,包括我,认为synchronized(this)
是一个经常使用的成语(也是在Java库中),是安全的,也是很好理解的。这是不应该避免的,因为您有一个bug,并且您不知道您的多线程程序中发生了什么。换句话说,如果它是适用的,那就使用它。
我有兴趣看到一些真实世界的例子(没有foobar的东西),避免锁定。this
当synchronized(this)
也能做好这份工作。
因此:你应该总是避免synchronized(this)
用私人引用上的锁替换它?
一些进一步的信息(随着答案的提供而更新):
- 我们讨论的是实例同步。
- 两个隐式(
synchronized
方法)的显式形式。synchronized(this)
被认为 - 如果你引用布洛赫或其他权威人士的话,不要遗漏你不喜欢的部分(例如有效的Java,线程安全项目:
通常情况下,它是实例本身的锁,但也有例外。)
- 如果您需要在您的锁定中使用粒度而不是
synchronized(this)
提供,然后synchronized(this)
是不适用的,所以这不是问题所在