偶然发现这个问题的公认答案:https://stackoverflow.com/questions/186964/java-core-api-anti-patterns-what-is-wrong/891589#891589提到:
Every object being available for locking instead of specific lock
objects(.NET has the same problem)
为什么它是反模式?
换句话说:
- 如何证明语句中存在反模式?
- 如何证明语句中没有反模式?
我不知道那个人的确切意思,但一个副作用是你可以这样写:
private final String s = "mutex";
private void m1() { synchronized(s) {} }
private final Boolean b = Boolean.FALSE;
private void m2() { synchronized(b) {} }
看起来这些方法使用的是私有(private)非共享锁。但是字符串是 intern 的,所以使用“mutex”作为互斥量的另一个代码实际上会使用相同的锁,这很容易导致死锁。同样,Boolean.FALSE 可以从导致相同问题的外来代码访问。
另请参阅:Problem with synchronizing on String objects?