死锁

来源:互联网 发布:帝国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{

把锁打开;

}

原创粉丝点击