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

Java多线程 -- 死锁

2015-08-26 21:28 453 查看
Java线程:并发协作-死锁

线程发生死锁可能性很小,即使看似可能发生死锁的代码,在运行时发生死锁的可能性也是小之又小。

发生死锁的原因一般是两个对象的锁相互等待造成的。

在《Java线程:线程的同步与锁》一文中,简述死锁的概念与简单例子,但是所给的例子是不完整的,这里给出一个完整的例子。

/**

* Java线程:并发协作-死锁

*

* @author chb

*/

public class Test {

public static void main(String[] args) {

DeadlockRisk dead = new DeadlockRisk();

MyThread t1 = new MyThread(dead, 1, 2);

MyThread t2 = new MyThread(dead, 3, 4);

MyThread t3 = new MyThread(dead, 5, 6);

MyThread t4 = new MyThread(dead, 7, 8);

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) {

this.dead = dead;

this.a = a;

this.b = b;

}

@Override

public void run() {

dead.read();

dead.write(a, b);

}

}

class DeadlockRisk {

private static class Resource {

public int value;

}

private Resource resourceA = new Resource();

private Resource resourceB = new Resource();

public int read() {

synchronized (resourceA) {

System.out.println("read():" + Thread.currentThread().getName() + "获取了resourceA的锁!");

synchronized (resourceB) {

System.out.println("read():" + Thread.currentThread().getName() + "获取了resourceB的锁!");

return resourceB.value + resourceA.value;

}

}

}

public void write(int a, int b)
{

synchronized (resourceB) {

System.out.println("write():" + Thread.currentThread().getName() + "获取了resourceB的锁!");

synchronized (resourceA) {

System.out.println("write():" + Thread.currentThread().getName() + "获取了resourceA的锁!");

resourceA.value = a;

resourceB.value = b;

}

}

}

}

下面死锁的情况发生了,真是难得一见啊:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: