您的位置:首页 > 编程语言 > Java开发

Java多线程:线程死锁

2017-02-28 17:02 239 查看
发生死锁的原因一般是两个对象的锁相互等待造成的。

下面用一个实例来构造这种情况:

[java] view
plain copy

 print?

package basic.e_deadlock;  

  

import org.apache.log4j.Logger;  

  

public class TestDeadLock {  

    public static void main(String[] args) {  

        DeadlockRisk dead = new DeadlockRisk();  

        MyThread t1 = new MyThread(dead, 1, 2, "线程1");  

        MyThread t2 = new MyThread(dead, 3, 4, "线程2");  

        MyThread t3 = new MyThread(dead, 5, 6, "线程3");  

        MyThread t4 = new MyThread(dead, 7, 8, "线程4");  

        t1.start();  

        t2.start();  

        t3.start();  

        t4.start();  

    }  

}  

  

class MyThread extends Thread {  

    private DeadlockRisk dead;  

    private int a, b;  

  

    MyThread(DeadlockRisk dead, int a, int b, String threadName) {  

        this.dead = dead;  

        this.a = a;  

        this.b = b;  

        this.setName(threadName);  

    }  

  

    @Override  

    public void run() {  

        dead.read();  

        dead.write(a, b);  

    }  

}  

  

class DeadlockRisk {  

    private static Logger logger = Logger.getLogger(DeadlockRisk.class);  

    private static class Resource {  

        public int value;  

    }  

  

    private Resource resourceA = new Resource();  

    private Resource resourceB = new Resource();  

  

    public void read() {  

        logger.debug("===========read  begin===========");  

        synchronized (resourceA) {  

            logger.debug("read():" + Thread.currentThread().getName() + "获取了resourceA 的锁!");  

            synchronized (resourceB) {  

                logger.debug("read():" + Thread.currentThread().getName() + "获取了resourceB 的锁!");  

            }  

        }  

        logger.debug("===========read  end=============");  

    }  

  

    public void write(int a, int b) {  

        logger.debug("===========write begin===========");  

        synchronized (resourceB) {  

            logger.debug("write():" + Thread.currentThread().getName() + "获取了resourceB 的锁!");  

            synchronized (resourceA) {  

                logger.debug("write():" + Thread.currentThread().getName() + "获取了resourceA 的锁!");  

                resourceA.value = a;  

                resourceB.value = b;  

            }  

        }  

        logger.debug("===========write end=============");  

    }  

}  

执行结果:

[plain] view
plain copy

 print?

0    [线程1] DEBUG basic.e_deadlock.DeadlockRisk - ===========read  begin===========  

0    [线程2] DEBUG basic.e_deadlock.DeadlockRisk - ===========read  begin===========  

0    [线程4] DEBUG basic.e_deadlock.DeadlockRisk - ===========read  begin===========  

0    [线程3] DEBUG basic.e_deadlock.DeadlockRisk - ===========read  begin===========  

0    [线程1] DEBUG basic.e_deadlock.DeadlockRisk - read():线程1获取了resourceA 的锁!  

0    [线程1] DEBUG basic.e_deadlock.DeadlockRisk - read():线程1获取了resourceB 的锁!  

0    [线程1] DEBUG basic.e_deadlock.DeadlockRisk - ===========read  end=============  

0    [线程2] DEBUG basic.e_deadlock.DeadlockRisk - read():线程2获取了resourceA 的锁!  

0    [线程1] DEBUG basic.e_deadlock.DeadlockRisk - ===========write being===========  

1    [线程2] DEBUG basic.e_deadlock.DeadlockRisk - read():线程2获取了resourceB 的锁!  

1    [线程2] DEBUG basic.e_deadlock.DeadlockRisk - ===========read  end=============  

1    [线程2] DEBUG basic.e_deadlock.DeadlockRisk - ===========write being===========  

1    [线程1] DEBUG basic.e_deadlock.DeadlockRisk - write():线程1获取了resourceB 的锁!  

1    [线程4] DEBUG basic.e_deadlock.DeadlockRisk - read():线程4获取了resourceA 的锁!  

注意:此时线程1在等待resourceB的资源,线程2在等待resourceA的资源。两个线程在相互等待,出现死锁。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐