zoukankan      html  css  js  c++  java
  • 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();
    }
    }
    
  • 相关阅读:
    MindSpore 建立神经网络
    MindSpore 数据加载及处理
    MindSpore 初探, 使用LeNet训练minist数据集
    Ubuntu 20.04 Xrdp Black Screen Ubuntu 20.04 Xrdp 远程桌面黑屏
    基于Transformer的ViT、DETR、Deformable DETR原理详解
    Ubuntu 18.04 / 20.04 自定义锁屏时间
    Transformer中K 、Q、V的设置以及为什么不能使用同一个值
    Auto-Encoding Scene Graphs for Image Captioning
    Eureka中读写锁的奇思妙想,学废了吗?
    PostgreSQL-查询所有索引
  • 原文地址:https://www.cnblogs.com/ynzj123/p/12854594.html
Copyright © 2011-2022 走看看