是时候弃用同步,等待并通知了吗?


13

是否有一个场景(除了与古代JVM的兼容性以外),使用场景比synchronized使用Lock?谁能证明使用wait或使用notify较新的系统?

是否有任何算法必须在实现中使用其中之一?

我看到先前的问题涉及到此问题,但我想更进一步,实际上是deprecate这些问题。新设施已经消除了太多的陷阱,陷阱和警告。我只是觉得可能快要把它们标记为过时了。


4
您是否已阅读Brian Goetz的Java Concurrency in Practice?他在那里很好地介绍了隐式锁定与显式锁定的争论。
Martijn Verburg

@MartijnVerburg-遗憾的是,但是我对他的工作表示敬意。
OldCurmudgeon 2012年

1
同步关键字对于应该是线程安全的简单静态方法可能有用,对于我将使用并发的其他任何方法。但这是我的意见
Kemoda 2012年

Answers:


12

是否有任何算法必须在实现中使用其中之一?

几乎可以肯定。(实际上,从理论上讲,您应该能够使用其他java.util.concurrent ..类来模拟wait / notify 。并且可以用显式的Lock操作来替换sync……尽管您需要注意解锁finally条款。)

不过,也有大概的算法,其中在Java中,表现最好的实现涉及直接使用同步,有或没有等待和通知。


是时候弃用同步,等待并通知了吗?

不管上一个问题的答案是什么,答案都是肯定的。

等待/通知可以(并且经常)正确使用。在Java中,不赞成使用保留给已损坏的类和方法。即在紧急情况下应纠正继续使用的地方。如果Sun(现在是Oracle)不赞成使用诸如等待/通知之类的基本功能,则它们将为大量的遗留代码造成严重的兼容性问题。那不符合任何人的利益。

如果您想摆脱代码中的同步/等待/通知,那很好。但是弃用要求重写大量本质上正确的多线程代码,这将是一个糟糕的想法。企业IT经理和软件产品经理会讨厌您的建议...


根据Java文档,值得阅读“不赞成使用”的含义http : //docs.oracle.com/javase/1.5.0/docs/guide/javadoc/deprecation/deprecation.html

还要注意,我们正在谈论过时的东西,这是Java语言的核心。弃用会synchronized产生巨大的后果。


实际上,据我所记得,根据出色的“ Java并发实践”一书,java.util.concurrentutil类实际上更快。这些类在后台直接与VM对话,在同步时,VM在对象图中的对象上安装了钝锁,从而影响了全局性能。
阿库恩2012年

如果我发现我们实际上删除了synchronizedet。,请原谅我@Stephen 。等 我只是建议弃用,这实际上只是说不要将其用于新代码。我不会幻想建议破坏性的经过测试的遗留代码,要求将其删除。
OldCurmudgeon 2012年

@OldCurmudgeon-响应较晚,但是我认为弃用过于极端。1)这意味着该特征可以被移除。2)这意味着该功能已被破坏,这与仅是过时的有所不同。3)许多人仍然很乐意以这种方式编写新代码……并且没有充分的理由不这样做。4)还有其他一些减少您“面对”的方法来阻止它;例如,编写PMD规则...
Stephen C

@StephenC-那时我们可以采取的戏剧性措施少一些,最终将导致他们在大学中不被使用或教导。显然应避免使用它们。我怀疑PMD规则-尽管是个好主意-不会很快到达老师。
OldCurmudgeon

1
@StephenC nitpick:按照您链接到的Java文档进行操作,我认为弃用并不意味着弃用的代码已损坏。这是一个原因,但是正如文档所说,当一个API被新的,更好的API取代时,API可能会被弃用(OP认为并发就是这种情况)。而且,低级并发(如果实际上并未鼓励不良做法)当然容易出错。
Andres F.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.