28.JAVA编程之线程死锁

过多的同步有可能出现死锁,死锁的操作一般是在程序运行的时候才有可能出现

多线程中要进行资源的共享,就需要同步,但同步过多,就可能造成死锁

示例代码:
此代码中,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编译器中的运行效果:

你可能感兴趣的:(28.JAVA编程之线程死锁)