产生死锁的原因

所谓死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象.互相抢占对方的锁,若无外力作用,它们都将无法推进下去
Snipaste_2021-08-15_15-02-34.png
示例代码

/**
 * <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应用程序的资源消耗和性能进行监控,并画出大量的图表,提供强大的可视化界面。而且本身占用的服务器内存很小,甚至可以说几乎不消耗。双击打开程序
Snipaste_2021-08-15_15-04-27.png
弹出以下界面,可以选择本地检测也可以远程操作服务器上的死锁
Snipaste_2021-08-15_15-05-19.png
选择不安全的链接
Snipaste_2021-08-15_15-05-33.png
选择线程
Snipaste_2021-08-15_15-06-03.png
然后检测死锁
Snipaste_2021-08-15_15-06-16.png
然后就可以看到死锁的线程
Snipaste_2021-08-15_15-06-42.png

Last modification:August 15, 2021
如果觉得这篇技术文章对你有用,请随意赞赏