如果不加选择地进行同步,则还存在创建死锁的风险。
假设我有两个类,并且 ,它们都有一个同步方法。进一步假设每个类都有一个同步方法,将另一个类的实例作为参数。FooBardoSomething()
public class Foo {
    synchronized void doSomething() {
        //code to doSomething
    }
    synchronized void doSomethingWithBar(Bar b) {
        b.doSomething();
    }
}
public class Bar {
    synchronized void doSomething() {
        //code to doSomething
    }
    synchronized void doSomethingWithFoo(Foo f) {
        f.doSomething();
    }
}
您可以看到,如果您有 一个 实例和 一个 实例,两者都尝试同时对彼此执行它们的方法,则可能会发生死锁。FooBardoSomethingWith*
要强制死锁,您可以在这两种方法中插入 sleep(用作示例):doSomethingWith*Foo
synchronized void doSomethingWithBar(Bar b) {
    try {
        Thread.sleep(10000);
    } catch (InterruptedException ie) {
        ie.printStackTrace();
    }
    b.doSomething();
}
在 main 方法中,启动两个线程来完成该示例:
public static void main(String[] args) {
    final Foo f = new Foo();
    final Bar b = new Bar();
    new Thread(new Runnable() {
        public void run() {
            f.doSomethingWithBar(b);
        }
    }).start();
    new Thread(new Runnable() {
        public void run() {
            b.doSomethingWithFoo(f);
        }
    }).start();
}