当前位置: 代码迷 >> 多核软件开发 >> 关于线程死锁解决办法
  详细解决方案

关于线程死锁解决办法

热度:2244   发布时间:2013-02-26 00:00:00.0
关于线程死锁
Java code
public class Test11 extends Thread {    public static void main(String[] args) {        Test11 t = new Test11();        t.start();//t线程开始执行        try {            Thread.sleep(500);//让主线程等待0.5秒,此时t线程应该执行结束        } catch (InterruptedException e) {            e.printStackTrace();        }        synchronized (t) {            try {                System.out.println("wait for t to complete...");                t.wait();            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println("total:" + t.total);        }    }    int total;    public void run() {        synchronized (this) {//运行期间保持锁            for (int i = 0; i < 100; i++) {                total += i;            }            System.out.println(total);            notify();//唤醒等待此对象锁的一个线程        }    }}


1.启动子线程t,t.start()运行它
2.让主线程等待0.5秒,在这0.5秒内,t线程已经运行完毕
3.进入主线程中的synchronzed块中,t.wait()放弃t对象锁,等待被唤醒
4.但是此时t线程已经执行完毕,不会再唤醒了,然后就死锁了?

这段代码运行会发生死锁的状态,但是这种情况可能会经常出现,该如何避免呢?

------解决方案--------------------------------------------------------
随便怎么处理一下都不会死锁.
比如:
Java code
      synchronized (t) {            try {                 if(t.total==0)     //加仪判断,如果条件成立,说明就等待,否则不等待了。                   {                     System.out.println("wait for t to complete...");                     t.wait();                   }            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println("total:" + t.total);        }
  相关解决方案