死锁 - 写一个简单的死锁

死锁 - 写一个简单的死锁


1、什么是死锁

多线程以及多进程改善了系统资源的利用率并提高了系统 的处理能力。然而,并发执行也带来了新的问题——死锁。
死锁是指两个或两个以上的进程(线程)在运行过程中因争夺资源而造成的一种僵局(Deadly-Embrace) ) ,若无外力作用,这些进程(线程)都将无法向前推进。

2、编写一个死锁

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/** @author Created by 谭健 on 2019/11/14. 星期四. 11:12. © All Rights Reserved. */
public class MyThread extends Thread {

  Lock firstLock, secondLock;
  String name;

  public MyThread(Lock firstLock, Lock secondLock, String name) {
    this.firstLock = firstLock;
    this.secondLock = secondLock;
    this.name = name;
  }

  @Override
  public void run() {
    System.out.println(name + " started.");
    firstLock.lock();
    System.out.println(name + " almost done.");
    secondLock.lock();
    System.out.println(name + " finished.");
    secondLock.unlock();
    firstLock.unlock();
  }

  public static void main(String[] args) throws InterruptedException {

    Lock lock1 = new ReentrantLock();
    Lock lock2 = new ReentrantLock();
    Lock lock3 = new ReentrantLock();

    Thread thread1 = new MyThread(lock1, lock2, "Thread 1");
    Thread thread2 = new MyThread(lock2, lock3, "Thread 2");
    Thread thread3 = new MyThread(lock3, lock1, "Thread 3");

    thread1.setName("Thread 1");
    thread2.setName("Thread 2");
    thread3.setName("Thread 3");

    thread1.start();
    thread2.start();
    thread3.start();
  }
}

如此,运行该程序,则极大概率进入死锁,并不是一定

3、分析

1、一般情况下,线程1 2 3 分别拿到锁1 2 3

2、然后线程1 尝试去拿锁2,锁2被线程2持有,线程1开始等待2

3、与此同时,线程2尝试拿锁3,锁3被线程3持有,线程2开始等待3

4、与此同时,线程3尝试拿锁1,锁1被线程1持有,线程3开始等待1

5、然后 1 = 2 , 2 = 3 , 3 = 1

6、就一直等,3把锁谁也不放,谁都想去争,于是发生死锁

发布了442 篇原创文章 · 获赞 1375 · 访问量 210万+

猜你喜欢

转载自blog.csdn.net/qq_15071263/article/details/103208298