1、准备死锁代码
import java.util.concurrent.TimeUnit;
public class E {
public static Object a=new Object();
public static Object b=new Object();
public static void main(String[] args) {
new Thread(()->{
synchronized (a){
System.out.println(Thread.currentThread().getName()+"锁住a,接下来想要获取b");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (b){
System.out.println(Thread.currentThread().getName()+"已经获取了b");
}
}
},"线程A:").start();
new Thread(()->{
synchronized (b){
System.out.println(Thread.currentThread().getName()+"锁住b,接下来想要获取a");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (a){
System.out.println(Thread.currentThread().getName()+"已经获取了a");
}
}
},"线程B:").start();
}
}
运行结果:
因为线程A和线程B都想获取对方所占有的锁,因而产生死锁。
2、进入终端,输入
jps -l
找到死锁程序的对应进程号
输入
jstack 12660
发现死锁出现在这里————你会发现:
线程A waiting to lock <0x0000000711b95ba8>
locked <0x0000000711b95b98>
线程B waiting to lock <0x0000000711b95b98>
locked <0x0000000711b95ba8>
线程A和线程B都想获取对方已经占有的锁,因而产生死锁现象。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)