死锁
来源:互联网 发布:帝国cms 建站交流 编辑:程序博客网 时间:2024/05/18 03:57
1.死锁是如何产生的
synchronized(对象名){
需要同步的代码;
}
在上述代码中,需要获取对象的内部锁然后访问,最后释放内部锁。
假设有两个线程A和B,线程A获得了锁X,线程B获得了锁Y,然后都进入休眠时间。苏醒过后线程A需要获得锁X,线程B需要获得锁Y,然后双方都等待对方释放锁,由此线程陷入阻塞。
2.代码示例
public class TestDeadLock { public void run() { MyThread mt = new MyThread(); new Thread(mt, "张三").start(); new Thread(mt, "李四").start(); } class MyThread implements Runnable { private Object o1 = new Object(); private Object o2 = new Object(); private boolean flag = true; @Override public void run() { if (flag) { flag = false; synchronized (o1) { System.out.println("have 01"); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (o2) { System.out.println("have 02"); } } } else { flag = true; synchronized (o2) { System.out.println(" have 002"); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (o1) { System.out.println(" have 001"); } } } } } public static void main(String[] args) { new TestDeadLock().run(); }}
以上程序运行结果为:have 01
have 002
(以下代码陷入死锁不在执行)
3.一个减少死锁的方法
try{
需要执行的代码;
}finally{
把锁打开;
}