• 49 什么是死锁?


    什么是死锁?

    答:
     

    1. 什么是死锁?

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

    2. 死锁发生的原因?

    虽然进程在运行过程中,可能发生死锁,但死锁的发生也必须具备一定的条件,死锁的发生必须具备以下四个必要条件。

    • 互斥条件:即当资源被一个线程使用(占有)时,别的线程不能使用

    • 请求和保持条件:即当资源请求者在请求其他的资源的同时保持对原有资源的占有。

    • 不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。

    • 环路等待条件:指在发生死锁时,存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。

    概念原文链接
    代码原文链接
     

    package com.sxy.thread;

    /**

    • 线程Thread1率先占有了resource1, 继续运行时需要resource2, 但此时resource2却被线程Thread2占有了,
    • 因此只能等待Thread2释放resource2才能够继续运行; 同时,Thread2也需要resource1,
    • 它只能等待Thread1释放resource1才能够继续运行, 因此,Thread1和Thread2都处于等待状态,
    • 谁也无法继续运行,即产生了死锁。
    * 
    * @author sunxy
    */
    public class DeadLock {
    
    public static void main(String[] args) {
    dead_lock();
    }
    
    private static void dead_lock() {
    // 两个资源
    final Object resource1 = "resource1";
    final Object resource2 = "resource2";
    // 第一个线程,想先占有resource1,再尝试着占有resource2
    Thread t1 = new Thread() {
    public void run() {
    // 尝试占有resource1
    synchronized (resource1) {
    // 成功占有resource1
    System.out.println("Thread1 1:locked resource1");
    // 休眠一段时间
    try {
    Thread.sleep(50);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    // 尝试占有resource2,如果不能占有,该线程会一直等到
    synchronized (resource2) {
    System.out.println("Thread1 1:locked resource2");
    }
    }
    }
    };
    // 第二个线程,想先占有resource2,再占有resource1
    Thread t2 = new Thread() {
    public void run() {
    // 尝试占有resource2
    synchronized (resource2) {
    // 成功占有resource2
    System.out.println("Thread 2 :locked resource2");
    // 休眠一段时间
    try {
    Thread.sleep(50);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    // 尝试占有resource1,如果不能占有,该线程会一直等到
    synchronized (resource1) {
    System.out.println("Thread1 2:locked resource1");
    }
    }
    }
    };
    // 启动线程
    t1.start();
    t2.start();
    }
    }
    
  • 相关阅读:
    CF Round #569 Div2(contest1180)
    HY中考游记
    Luogu P2309 loidc,卖卖萌
    点击按钮使用window.open打开页面后,再次点击按钮会再打开一个页面,如何解决?
    line-height:150%/1.5em与line-height:1.5的区别
    table使用display:block时会多出一条边框
    让360双核浏览器默认极速模式,避免采用兼容模式
    使用nodejs安装http-server
    行内元素内边距对左右下起作用,外边距只对左右起作用
    微信小程序示例
  • 原文地址:https://www.cnblogs.com/ynzj123/p/12854594.html
Copyright © 2020-2023  润新知