死锁定义
死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁。死锁通常发生在多个线程同时但以不同的顺序请求同一组锁的时候。
下面通过synchronized来实现死锁,在DeakLock类中,定义m1,m2两个方法。m1方法中,如果线程thread-0获取cpu资源会持有o1,然后尝试持有o2锁。m2方法中,如果线程thread-1获取cpu资源会持有o2,然后尝试持有o1锁。造成了死锁现象。
public class DeakLock {
private final Object o1 = new Object();
private final Object o2 = new Object();
public void m1() {
synchronized (o1) {
System.out.println(Thread.currentThread().getName() + "持有o1锁");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2) {
System.out.println(Thread.currentThread().getName() + "持有o1锁尝试获取o2");
}
}
}
public void m2() {
synchronized (o2) {
System.out.println(Thread.currentThread().getName() + "持有o2锁");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o1) {
System.out.println(Thread.currentThread().getName() + "持有o2锁尝试获取o1");
}
}
}
}
public class DeakLockMain {
public static void main(String[] args) {
DeakLock deakLock = new DeakLock();
new Thread(()-> {
deakLock.m1();
}, "thread-0").start();
new Thread(()-> {
deakLock.m2();
}, "thread-1").start();
}
}
******************************************
thread-0持有o1锁
thread-1持有o2锁
可以通过jstack来查看分析线程状态
jstack PID
网友评论