线程安全第二大类问题——死锁
逻辑代码:
package controller;
/**
* 第二类线程安全问题:死锁
*/
public class MultiThreadError implements Runnable{
int flag = 1;
static Object o1 = new Object();
static Object o2 = new Object();
public static void main(String[] args) {
MultiThreadError r1 = new MultiThreadError();
MultiThreadError r2 = new MultiThreadError();
r1.flag = 1;
r2.flag = 0;
new Thread(r1).start();
new Thread(r2).start();
}
@Override
public void run() {
System.out.println("flag = "+ flag);
if(flag == 1){
synchronized (o2){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o1){
System.out.println("1");
}
}
}
if(flag == 0){
synchronized (o1){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2){
System.out.println("0");
}
}
}
}
}
输出结果:打印出flag = 1
flag = 0 ,不会打印出 0 和1 ,并且程序不会停止,因为死锁了
flag = 1
flag = 0