线程发生死锁的可能性很小,即使看似发生死锁的代码,在运行时发生死锁的可能性小之又小。
发生死锁的原因一般情况下是两个对象的锁相互等待造成的。
代码如下:
package Test;
/**
* java线程,并发协作,死锁
*/
public class ThreadExtend_DeadLock extends Thread{
private DeadLock deadLock;
private int a,b;
ThreadExtend_DeadLock(DeadLock deadLock, int a, int b){
this.deadLock=deadLock;
this.a=a;
this.b=b;
}
@Override
public void run() {
deadLock.read();
deadLock.write(this.a,this.b);
}
public static void main(String args[]){
DeadLock deadLock=new DeadLock();
new ThreadExtend_DeadLock(deadLock,1,2).start();
new ThreadExtend_DeadLock(deadLock,3,4).start();
new ThreadExtend_DeadLock(deadLock,5,6).start();
new ThreadExtend_DeadLock(deadLock,7,8).start();
new ThreadExtend_DeadLock(deadLock,9,10).start();
}
}
/**
* 锁对象
*/
class DeadLock {
private static class Resource{
public int value;
}
private Resource resourceA=new Resource();
private Resource resourceB=new Resource();
/**
* 读取数据
* @return
*/
public int read(){
synchronized (resourceA){
System.out.println("read():"+Thread.currentThread().getName()+"获取了resourceA的锁");
synchronized (resourceB){
System.out.println("read():"+Thread.currentThread().getName()+"获取了resourceB的锁");
return resourceA.value+resourceB.value;
}
}
}
/**
* 写入数据
* @param a
* @param b
*/
public void write(int a,int b){
synchronized (resourceB){
System.out.println("write():"+Thread.currentThread().getName()+"获取了resourceA的锁");
synchronized (resourceA){
System.out.println("write():"+Thread.currentThread().getName()+"获取了resourceB的锁");
resourceA.value=a;
resourceB.value=b;
}
}
}
}
结果如下:
通过控制面板我们可以发现,程序一直在可运行的状态,并没有运行完成以后,进行释放,因此就证明“死锁”的产生。