public class Test {
static Object o1 = new Object();
static Object o2 = new Object();
public static void main(String[] args) {
synch synch1 = new synch();
synch synch2 = new synch();
synch1.a=0;
synch2.a=2;
Thread t1 = new Thread(synch1);
Thread t2 = new Thread(synch2);
t1.start();
t2.start();
}
}
class synch implements Runnable{
int a;
public void run() {
System.out.println(a);
if(a == 0){
try {
synchronized (Test.o1) {
Thread.sleep(500);
}
synchronized (Test.o2) {
System.out.println("aaaa");
}
} catch (InterruptedException ex) {
}
}
else
try {
synchronized (Test.o2) {
Thread.sleep(500);
}
synchronized (Test.o1) {
System.out.println("aaba");
}
} catch (InterruptedException ex) {
}
}
}
运行后显示
compile:
run:
0
2
aaba
aaaa
BUILD SUCCESSFUL (total time: 0 seconds)
没有发生死锁,这是为什么????/我哪里搞错了啊?
synchronized (Test.o2) {
Thread.sleep(500);
} //这里就释放了Test.o2的对象锁了吧
System.out.println(a);
if(a == 0){
try {
synchronized (TestSync.o1) { //已获取o1对象锁
Thread.sleep(500);
System.out.println("Try to get o2");
synchronized (TestSync.o2) { //未释放o1,尝试获取o2,被挂起
System.out.println("aaaa");
}
}
} catch (InterruptedException ex) {
}
} else {
try {
synchronized (TestSync.o2) { //已获取o2的对象锁
Thread.sleep(500);
System.out.println("Try to get o1");
synchronized (TestSync.o1) { //未释放o2,尝试获取o1,也被挂起,死锁
System.out.println("aaba");
}
}
} catch (InterruptedException ex) {
}
}
}