如果不加选择地进行同步,则还存在创建死锁的风险。
假设我有两个类,并且 ,它们都有一个同步方法。进一步假设每个类都有一个同步方法,将另一个类的实例作为参数。Foo
Bar
doSomething()
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();
}
}
您可以看到,如果您有 一个 实例和 一个 实例,两者都尝试同时对彼此执行它们的方法,则可能会发生死锁。Foo
Bar
doSomethingWith*
要强制死锁,您可以在这两种方法中插入 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();
}