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