page contents

@$什么是线程死锁?

轩辕小不懂 发布于 2022-08-06 11:15
阅读 526
收藏 0
分类:高并发架构
4022
Nen
Nen
- 程序员

百度百科:死锁是指两个或两个以上的进程(线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程(线程)称为死锁进程(线程)。

如下图所示,线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对方的资源,所以这两个线程就会互相等待而进入死锁状态。

attachments-2022-08-xyFDRhW962eddf2ef3778.png下面通过一个例子来说明线程死锁,代码模拟了上图的死锁的情况 (代码来源于《并发编程之美》):

public class DeadLockDemo {

   private static Object resource1 = new Object();//资源 1

   private static Object resource2 = new Object();//资源 2

   public static void main(String[] args) {

       new Thread(() -> {

           synchronized (resource1) {

               System.out.println(Thread.currentThread() + "get resource1");

               try {

                   Thread.sleep(1000);

              } catch (InterruptedException e) {

                   e.printStackTrace();

              }

               System.out.println(Thread.currentThread() + "waiting get resource2");

               synchronized (resource2) {

                   System.out.println(Thread.currentThread() + "get resource2");

              }

          }

      }, "线程 1").start();


       new Thread(() -> {

           synchronized (resource2) {

               System.out.println(Thread.currentThread() + "get resource2");

               try {

                   Thread.sleep(1000);

              } catch (InterruptedException e) {

                   e.printStackTrace();

              }

               System.out.println(Thread.currentThread() + "waiting get resource1");

               synchronized (resource1) {

                   System.out.println(Thread.currentThread() + "get resource1");

              }

          }

      }, "线程 2").start();

  }

}

输出结果


Thread[线程 1,5,main]get resource1

Thread[线程 2,5,main]get resource2

Thread[线程 1,5,main]waiting get resource2

Thread[线程 2,5,main]waiting get resource1

线程 A 通过 synchronized (resource1) 获得 resource1 的监视器锁,然后通过Thread.sleep(1000)方法让线程 A 休眠 1s ,为的是让线程 B 得到CPU执行权,然后获取到 resource2 的监视器锁。线程 A 和线程 B 休眠结束了都开始企图请求获取对方的资源,然后这两个线程就会陷入互相等待的状态,这也就产生了死锁。上面的例子符合产生死锁的四个必要条件。

请先 登录 后评论