这段代码,我执行了多次,其中有几次出现卡住,怀疑是死锁,但是我不知道为啥死锁

紫电清霜 发布于 2014/07/11 14:45
阅读 393
收藏 1

一个线程去get,一个线程去add,这时候没有出现问题
两个线程去get,一个线程去add,这时候出现问题了:我执行了多次,其中有几次出现卡住,长时间无响应,程序没有继续往下执行的情况(我估计是产生了死锁,但是我不知道为什么会产生死锁)


class Plate{
    int count = 10; // 共有10个鸡蛋
    boolean hasEgg = false; // 盘子里是否有鸡蛋(盘子里最多只能放一个鸡蛋)
    public synchronized void addEgg() throws InterruptedException {
        Thread.sleep(100);
        if(hasEgg){
            System.out.println(Thread.currentThread().getName() + "-------will wait------>add");
            wait();
        }
        hasEgg = true;
        count--;
        System.out.println(Thread.currentThread().getName() + "------------------ OK --------------------->add");
        notify();
    }
    public synchronized void getEgg() throws InterruptedException {
        Thread.sleep(100);
        if( ! hasEgg){
            System.out.println(Thread.currentThread().getName() + "-------will wait------>get");
            wait();
        }
        hasEgg = false;
        System.out.println(Thread.currentThread().getName() + "--------------------- OK -------------------->get");
        notify();
    }
    public synchronized int count(){
        return count;
    }
}
class Add implements Runnable{
    int i=0;
    Plate plate;
    public Add(Plate plate){
        this.plate = plate;
    }
    public void run(){
        try {
            while(plate.count>0){
                plate.addEgg();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
class Get implements Runnable{
    int i=0;
    Plate plate;
    public Get(Plate plate){
        this.plate = plate;
    }
    public void run(){
        try {
            while(plate.count>0){
                plate.getEgg();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
public class Egg{
    public static void main(String[] args) {
        Plate plate = new Plate();
        Runnable get = new Get(plate);
        Runnable add = new Add(plate);
        // 2个线程去get
        new Thread(get).start();
        new Thread(get).start();
        // 1个线程去set
        new Thread(add).start();
    }
}




求大侠帮忙解答下(不知道为啥会死锁,有一定概率),感谢:)

(运行环境为win xp 32位 jdk1.6)

加载中
0
厚客
厚客
关键是 Thread.sleep(100);
0
甘薯
甘薯

楼主的代码写得相当乱,

hasEgg完全可以用count是否大于1代替。

notify是否可以换成notifyAll.

有日子没碰java了,答错勿怪

0
quickstart
quickstart
边界条件时死锁,当count为0时,最后一个get线程wait后就不能再唤醒。
0
DanielTo
DanielTo
你确定是卡住了还是程序执行完了
返回顶部
顶部