1.背景
程序有两个入口,一个是从界面发起,一个是从MQ消息过来的,同时请求,请求的资源之间相互请求等待,形成死锁。表现:界面不响应。堆栈显示有死锁。
2.死锁原因:相互持有同步资源并相互等待。
package testsychronized;
/**
* 模仿B级故障重现死锁现象。
* */
public class TestDeadLock {
public static void main(String[] args) {
new Thread1().start();
new Thread2().start();
}
}
class Thread1 extends Thread {
@Override
public void run() {
try {
Web.get4Web();
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Thread2 extends Thread {
@Override
public void run() {
try {
LoadModel.loading();
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Web {
public static synchronized void get4Web() {
try {
System.out.println("Get 4 Web Begaining...");
LoadModel.getInfo();
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Get 4 Web Ending...");
}
public static synchronized void setType() {
try {
System.out.println("Set Type Begaining...");
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Set Type Ending...");
}
}
class LoadModel {
public static synchronized void getInfo() {
try {
System.out.println("Get Info begaining...");
Thread.sleep(3000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Get Info Endining...");
}
public static synchronized void loading() {
try {
System.out.println("Loading Info begaining...");
Web.setType();
Thread.sleep(3000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Loading Info Endining...");
}
}
3. synchronizaed少用在方法上,减少锁的粒度,ReentrantLock或者CAS或者设计模式解决问题。