产生死锁的原因
所谓死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象.互相抢占对方的锁,若无外力作用,它们都将无法推进下去
示例代码
/**
* <p>
* Description:
* </p>
*
* @author songzixian
* @version v2.0.0
* @create 2021-08-15 14:25
* @see com.songzixian.thread
*/
public class ThreadCount03 implements Runnable{
private static int count = 100;
private String lock = "lock";
@Override
public void run() {
//死锁演示
while (true){
count++;
if (count % 2 ==0){
synchronized (lock){
a();
}
}else {
synchronized (this){
b();
}
}
}
}
public synchronized void a(){
System.out.println(Thread.currentThread().getName()+"----a方法抢到了锁");
}
public synchronized void b(){
synchronized (lock){
System.out.println(Thread.currentThread().getName()+"----b方法抢到了锁");
}
}
public static void main(String[] args) {
ThreadCount03 t1 = new ThreadCount03();
new Thread(t1).start();
new Thread(t1).start();
}
}
检测死锁
Jconsole是JDK自带的监控工具,在JDK/bin目录下可以找到jconsole.exe
程序。它用于连接正在运行的本地或者远程的JVM,对运行在Java应用程序的资源消耗和性能进行监控,并画出大量的图表,提供强大的可视化界面。而且本身占用的服务器内存很小,甚至可以说几乎不消耗。双击打开程序
弹出以下界面,可以选择本地检测也可以远程操作服务器上的死锁
选择不安全的链接
选择线程
然后检测死锁
然后就可以看到死锁的线程