拥有死锁的程序 并不是每一次都互相锁住 也许能正常运行 也许被永远锁住
@Test
public void test() throws InterruptedException {
//那个被多个线程来共同操作的对象 这次试验使用静态方法了 。。。 所以就不用new 出来对象了。。。
ThisLock thisLock =new ThisLock();
//线程 t1
Thread t1 = new Thread("t1"){
@Override
public void run() {
try {
thisLock.service1();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
//线程 t2
Thread t2 = new Thread("t2"){
@Override
public void run() {
try {
thisLock.service2();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
//--------------------------------------------------
t1.start();
t2.start();
//加入join是因为junit在执行完测试方法 就关闭jvm了 所以其他线程还没运行完就意外退出了。。。。
t1.join();
t2.join();
}
public class ThisLock {
private final Object lock1 = new Object();
private final Object lock2 = new Object();
public void service1() throws InterruptedException {
int i = 0;
synchronized (lock1){
print("lock1锁住");
synchronized (lock2){
print("lock2锁住");
while (i<5){
Thread.sleep(1_000);
print("service1");
i++;
}
print("lock2释放");
}
print("lock1释放");
}
}
public void service2() throws InterruptedException {
int i = 0;
synchronized (lock2){
print("lock2锁住");
synchronized (lock1){
print("lock1锁住");
while (i<5){
Thread.sleep(1000);
print("service2");
i++;
}
print("lock1释放");
}
print("lock2释放");
}
}
private static void print(Object o){
System.out.println(o);
}
}
正常运行下:
lock1锁住
lock2锁住
service1
service1
service1
service1
service1
lock2释放
lock1释放
lock2锁住
lock1锁住
service2
service2
service2
service2
service2
lock1释放
lock2释放
锁住:
lock2锁住
lock1锁住
程序永远停在那里了。。。