非死锁
public class DeadLock extends Thread{
Object o1 = new Object();
Object o2 = new Object();
int flag = 0;
@Override
public void run() {
if(flag == 1){
synchronized (o1) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2) {
System.out.println("1");
}
}
}
if(flag == 0){
synchronized (o2) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o1) {
System.out.println("0");
}
}
}
}
public static void main(String[] args) {
DeadLock dl1 = new DeadLock();
dl1.flag = 1;
DeadLock dl2 = new DeadLock();
dl2.flag = 0;
dl1.start();
dl2.start();
}
}
死锁
public class DeadLock extends Thread{
static Object o1 = new Object();
static Object o2 = new Object();
int flag = 0;
@Override
public void run() {
if(flag == 1){
synchronized (o1) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2) {
System.out.println("1");
}
}
}
if(flag == 0){
synchronized (o2) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o1) {
System.out.println("0");
}
}
}
}
public static void main(String[] args) {
DeadLock dl1 = new DeadLock();
dl1.flag = 1;
DeadLock dl2 = new DeadLock();
dl2.flag = 0;
dl1.start();
dl2.start();
}
}
//第一个不是死锁,因为每次new一个DeadLock对象的时候,都会创建不同Object o1和o2对象,它们所锁住的对象不是同一个对象,故非死锁
//第二个是死锁,因为每次new一个DeadLock对象的时候,Object o1和o2对象是相同的,它们所锁住的对象是同一个对象,故死锁