避免在Java中同步(这)?

问题:

每当有关Java同步的问题出现时,有些人都非常渴望指出synchronized(this)应该避免。相反,他们声称,私人参考的锁将是首选。
一些原因是:

其他人,包括我在内,认为synchronized(this)是一个很常用的成语(在Java库中也是这样),是安全和很好理解的。不应该避免,因为你有一个错误,你不知道在多线程程序中发生了什么。换句话说:如果适用,则使用它。
我有兴趣看到一些现实世界的例子(没有foobar的东西),当synchronized(this)也做这个工作时,避免this上的锁定是更可取的。
因此:你应该总是避免
一些更多信息(更新为答案):

  • 我们正在谈论实例同步
  • 考虑隐式(synchronized方法)和synchronized(this)的显式形式
  • 如果您引用Bloch或其他权威机构,请不要遗漏您不喜欢的部分(例如,有效的Java,线程安全性的条目:Typically it is the lock on the instance itself, but there are exceptions.)
  • 如果您在synchronized(this)提供的锁定中需要粒度,则synchronized(this)不适用,因此不是问题

回答:

我将分别介绍每一点。

  1.  

    Some evil code may steal your lock (very popular this one, also has an
    “accidentally” variant)

    我更担心accidentally。相当于,这种使用this是您的类的暴露界面的一部分,应该记录在案。有时,其他代码使用你的锁的能力是可取的。对于Collections.synchronizedMap(见javadoc)这样的事情就是这样的。

  2.  

    All synchronized methods within the same class use the exact same
    lock, which reduces throughput

    这是过于简单的思考;只是摆脱synchronized(this)不能解决问题。吞吐量的正确同步将会更多的考虑。

  3.  

    You are (unnecessarily) exposing too much information

    这是#1的变种。使用synchronized(this)是您界面的一部分。如果你不想/需要这个暴露,不要这样做。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Avoid synchronized(this) in Java?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

84 − 78 =