发现这个问题的接受答案:https://stackoverflow.com/questions/186964/java-core-api-anti-patterns-what-is-wrong/891589#891589提到:
每个对象都可用于锁定而不是特定的锁定 对象(.NET有同样的问题)
为什么它是一种反模式?
或者换句话说:
答案 0 :(得分:4)
我不知道那个人究竟是什么意思,但一个副作用是你可以这样写:
private final String s = "mutex";
private void m1() { synchronized(s) {} }
private final Boolean b = Boolean.FALSE;
private void m2() { synchronized(b) {} }
看起来这些方法正在使用私有非共享锁。但字符串被实习,因此使用" mutex"因为互斥锁实际上会使用相同的锁,这很容易导致死锁。类似地,可以从外来代码访问Boolean.FALSE导致相同的问题。