多线程的死锁

Posted 小胡的技术之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程的死锁相关的知识,希望对你有一定的参考价值。

概述

java线程死锁是一个经典的多线程问题,因为不同的线程都在等待根本不可能被释放的锁,从而导致所有的线程任务都无法继续完成。在多线程技术中,“死锁”是必须避免的,因为这会造成线程的“假死”。

代码实例

DealThread.java


public class DealThread implements Runnable{
   public String username;
   public Object lock1 = new Object();
   public Object lock2 = new Object();
   public void setFlag(String username){
       this.username = username;
       } @Override public void run() {    if ("a".equals(username)) {        synchronized (lock1) {            try {                System.out.println("username = "+ username);                Thread.sleep(3000);            } catch (InterruptedException e) {                e.printStackTrace();            }            synchronized (lock2) {                System.out.println("按照 lock1 -》lock2代码顺序执行了");            }        }    }    if ("b".equals(username)) {        synchronized (lock2) {            try {                System.out.println("username = "+ username);                Thread.sleep(3000);            } catch (InterruptedException e) {                e.printStackTrace();            }            synchronized (lock1) {                System.out.println("按照 lock2 -》lock1代码顺序执行了");            }        }    }  } }

Run1.java

public class Run1 {
   public static void main(String[] args) {
       try {
           DealThread  t1 = new DealThread();
           t1.setFlag(“a”);
           Thread thread1 = new Thread(t1);
           thread1.start();
           Thread.sleep(100);
           t1.setFlag(“b”);
           Thread thread2 = new Thread(t1);
           thread2.start();
       } catch (InterruptedException e) {
           e.printStackTrace();
         }
        }
      }

结果:

出现了死锁

JDK自带工具检测死锁现象

1.首先进入CMD工具,再进入JDK的安装文件夹中的bin目录

多线程的死锁

2.执行JPS命令

3.执行命令jstack命令

步骤2得到Run1的id的值是2992,再执行jstack命令,查看结果:

看的出来存在死锁的情况,死锁是程序设计的Bug,在设计程序的时候就要避免双方互相持有对方锁的情况。只要互相等待对方释放锁就有可能出现死锁。

以上是关于多线程的死锁的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程-死锁简述

死锁的概念以及处理方式

多线程的死锁

JAVA程序设计,多线程且避免死锁

多线程死锁代码

使用多线程代码在一张表上发生 MySQL 死锁