过多的同步有可能出现死锁,死锁的操作一般是在程序运行的时候才有可能出现
多线程中要进行资源的共享,就需要同步,但同步过多,就可能造成死锁
示例代码:
此代码中,Customer类中同步线程中调用了Waiter类的同步线程中的方法,造成了死锁
import javax.swing.plaf.synth.SynthOptionPaneUI;
import java.util.concurrent.locks.ReentrantLock;
public class ThreadDemo2 {
public static void main(String[] args) {
new DeadThread();
}
}
//死锁线程
class DeadThread implements Runnable{
Customer c = new Customer();
Waiter w = new Waiter();
public DeadThread(){
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.doService();
}
public synchronized void doService(){
System.out.println("同意了,吃完饭再买单");
}
}
class Waiter{
public synchronized void say(Customer c)
{
System.out.println("服务员说:先买单再吃饭");
c.doService();
}
public synchronized void doService(){
System.out.println("同意了,先吃饭再买单");
}
}
在IDEA编译器中,强大的IDEA会解决死锁问题,所以运行结果正常,运行效果:而实际情况下,是会发生死锁情况的,在Eclipse编译器中的运行效果: