避免在Java中同步(this)?
每当SO上出现有关Java同步的问题时,有些人都非常渴望指出应该避免。相反,他们声称,对私有引用的锁定是首选。synchronized(this)
一些给定的原因是:
- 一些邪恶的代码可能会偷走你的锁(这个很受欢迎,也有一个“意外”的变体)
- 同一类中的所有同步方法都使用完全相同的锁,这会降低吞吐量
- 你(不必要地)暴露了太多的信息
包括我在内的其他人认为,这是一个经常被使用的成语(也在Java库中),是安全的,并且很好理解。不应该避免它,因为你有一个错误,你不知道你的多线程程序中发生了什么。换句话说:如果它适用,那就使用它。synchronized(this)
我有兴趣看到一些现实世界的例子(没有foobar的东西),其中避免锁定是可取的,当也可以做这项工作时。this
synchronized(this)
因此:您是否应该始终避免同步(this)
并将其替换为私有引用上的锁定?
一些进一步的信息(随着答案的给出而更新):
- 我们正在谈论实例同步
- 同时考虑隐式 (方法) 和显式形式
synchronized
synchronized(this)
- 如果你引用布洛赫或其他权威人士的话,不要遗漏你不喜欢的部分(例如,有效的Java,线程安全上的项目:通常是实例本身的锁,但也有例外。
- 如果您需要除提供以外的锁定粒度,则不适用,因此这不是问题所在
synchronized(this)
synchronized(this)