java多线程之死锁

java

死锁在并发编程中是需要避免的,要修正死锁问题,必须明白死锁发生的条件:

1.互斥条件:

任务中使用的资源至少有一个是不能共享的

2.请求与保持条件:

一个进程因请求资源而阻塞时,对已获得的资源保持不放。 

3.不剥夺条件:

进程已获得的资源,在末使用完之前,不能强行剥夺。 

4.循环等待条件:

若干进程之间形成一种头尾相接的循环等待资源关系。 

下面我们着手实现一个死锁:

public class DeadThread implements Runnable {

public String username;

public Object lock1=new Object();

public Object lock2=new Object();

public void setFlag(String username){

this.username=username;

}

@Override

public void run() {

if(username.equals("a")){

synchronized (lock1){

try {

System.out.println("username="+username);

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

synchronized (lock2){

System.out.println("按lock1->lock2顺序执行了");

}

}

}

if(username.equals("b")){

synchronized (lock2){

try {

System.out.println("username="+username);

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

synchronized (lock1){

System.out.println("按lock2->lock1顺序执行了");

}

}

}

}

}

public class Run {

public static void main(String[] args) {

DeadThread d1=new DeadThread();

d1.setFlag("a");

Thread t1=new Thread(d1);

t1.start();

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

d1.setFlag("b");

Thread t2 = new Thread(d1);

t2.start();

}

}

以上是 java多线程之死锁 的全部内容, 来源链接: utcz.com/z/392998.html

回到顶部