概念:
兩個(gè)線程相互等待對(duì)方釋放鎖蚜点,造成死鎖。
示例:
普通java類:
public class POJO{
? ? Object a = new Object();
? ? Object b = new Object();
? ? public void a() {
? ? ? ? synchronized(a) {
? ? ? ????? System.out.println("aaaa");
? ? ? ? ????try{
? ? ? ? ? ? ????Thread.sleep(2000);
????????????} catch(InterruptedException e) {
? ? ? ? ? ????? e.printStackTrace();
????????????}
? ? ? ? ? ? b();
????????}
????}
????public void b() {
????????synchronized(b) {
????????????System.out.println("bbbb");
? ? ? ? ????try{
????????????????Thread.sleep(2000);
????????????} catch(InterruptedException e) {
????????????????e.printStackTrace();
????????????}
? ? ? ? ? ? a();
????????}
????}
}
線程A:
public class ThreadA extends Thread{
? ? private POJO pojo;
? ? public ThreadA(POJO pojo) {
? ? ? ? this.pojo = pojo;
????}
? ? public void run() {
? ? ? ? pojo.a();
????}
}
線程B:
public class ThreadB extends Thread{
????private POJO pojo;
? ? public ThreadB(POJO pojo) {
????????this.pojo = pojo;
????}
? ? public void run() {
????????pojo.b();
????}
}
Main方法:
public class Main{
? ? public static void main(String[] args) {
? ? ? ? POJO pojo = new POJO();
? ? ? ? Thread a = new ThreadA(pojo);
? ? ? ? a.start();
? ? ? ? Thread b = new ThreadB(pojo);
? ? ? ? b.start();
????}
}
運(yùn)行結(jié)果:
程序假死不動(dòng)。
查找原因:
進(jìn)入cmd而账,輸入jps,看到如下截圖因篇,看到AppMain的id為16248:
輸入jstack -l 16248泞辐,可以看出有死鎖存在: