过多的同步可能会出现死锁,死锁的操作一般是在程序运行的时候才有可能出现。
在一个同步方法中调用另一个对象的同步方法可能出现死锁。
package com.chocus.demo1;
public class ThreadDemo7 {
public static void main(String[] args) {
new DeadLock();
}
}
class DeadLock implements Runnable {
Customer c = new Customer();
Waiter w = new Waiter();
public DeadLock() {
new Thread(this).start();
w.say(c);
}
@Override
public void run() {
c.say(w);
}
}
class Customer {
public synchronized void say(Waiter w) {
System.out.println("顾客:先吃饭再买单");
w.agree();
}
public synchronized void agree() {
System.out.println("顾客:同意了,先买单再吃饭");
}
}
class Waiter {
public synchronized void say(Customer c) {
System.out.println("服务员:先买单再吃饭");
c.agree();
}
public synchronized void agree() {
System.out.println("服务员:同意了,先吃饭再买单");
}
}
结果
服务员:先买单再吃饭
顾客:先吃饭再买单