什么是死锁?(把死锁给大家讲明白,知道是什么,为什么用,怎么用)

简介: 什么是死锁?(把死锁给大家讲明白,知道是什么,为什么用,怎么用)

3个方面回答 :


1.死锁是什么?


提供了几种理解的方式帮助大家更好的理解;如有疑问可提出;


死锁是一组相互竞争资源的线程因为他们之间得到互相等待导致“永久“阻塞的现象; (你等我 我等你 你不放我也不放 就导致“永久“阻塞的现象)


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


了解了说你是死锁后我们要知道为什么会发生死锁呢,请看下面;


2.发生死锁的原因?


分为下面4钟原因

互斥条件

共享资源 X y 只能被一个线程占有

占用且等待

线程T1占用的共享资源X 他在等待共享Y的时候帮不释放自己的X

不可抢占

其他线程不能去抢占t1线程占有的资源

循环等待

线程t1 等t2 占有的资源,线程t2 等t1占有的资源 循环等等


3.如何避免死锁?


打破死锁的原因即可避免

互斥条件

无法破坏的因为锁本身就是通过互斥解决线程的安全的问题

占用且等待

一次性申请所有的资源就不会存在等待了

不可抢占

占用部分资源的线程,进一步申请其他的资源的时候如果申请不到可以主动释放他占有的资源,这样就破坏了不可抢占

循环等待

按照顺序申请资源进行预防,所谓按序申请是指资源是有线性顺序的,申请的时候可以先申请资源序号小的 在申请资源序号大的 ,这样线性化循环就不存在等待了


下面我们用代码理解下死锁:


package com.example;
public class Deadlock {
       public static String str1 = "str1";
        public static String str2 = "str2";
        public static void main(String[] args){
            Thread a = new Thread(() -> {
                try{
                    while(true){
                        synchronized(Deadlock.str1){
                            System.out.println(Thread.currentThread().getName()+"锁住 str1");
                            Thread.sleep(1000);
                            synchronized(Deadlock.str2){
                                System.out.println(Thread.currentThread().getName()+"锁住 str2");
                            }
                        }
                    }
                }catch(Exception e){
                    e.printStackTrace();
                }
            });
            Thread b = new Thread(() -> {
                try{
                    while(true){
                        synchronized(Deadlock.str2){
                            System.out.println(Thread.currentThread().getName()+"锁住 str2");
                            Thread.sleep(1000);
                            synchronized(Deadlock.str1){
                                System.out.println(Thread.currentThread().getName()+"锁住 str1");
                            }
                        }
                    }
                }catch(Exception e){
                    e.printStackTrace();
                }
            });
            a.start();
            b.start();
        }
    }


上面的代码就是一个完整的死锁程序,程序中有两个线程,线程1锁住了str1,获得锁之后休眠1秒钟,这个时候线程2锁住了str2,也进行休眠操作。

线程1休眠完了之后去锁str2,但是str2已经被线程2给锁住了,这边只能等待,同样的道理,线程2休眠完之后也要去锁str1,同样也会等待,这样死锁就产生了。

将下面这2行代码的值改成一样,就不会存在了

public static String str1 = "str1";
public static String str2 = "str1";


在声明一个对象作为锁的时候要注意字符串类型锁对象,因为字符串有一个常量池,如果不同的线程持有的锁是具有相同字符的字符串锁时,两个锁实际上同一个锁。

相关文章
|
6月前
|
Java
Java并发编程中的死锁问题及解决方法
【2月更文挑战第11天】 在Java并发编程中,死锁是一个常见但又非常棘手的问题。本文将深入探讨死锁的概念、产生原因以及常见的解决方法,帮助读者更好地理解并发编程中的挑战,并提供实用的解决方案。
90 6
|
5月前
|
Python
Python多线程中递归锁如何解决死锁问题的详细阐述
Python多线程中递归锁如何解决死锁问题的详细阐述
|
6月前
|
Java
Java线程面试题:什么是死锁?如何避免?
Java线程面试题:什么是死锁?如何避免?
70 0
|
算法 安全 Java
死锁的原理
之前在学校学习过程中,很少写多进程的代码,虽然操作系统中学过死锁相关的内容,但考试过后也基本就忘记了,后来自己也遇到过有些多进程死锁的情况,再加上看了有些资料,对死锁才算是有了有些深入的理解。
79 0
|
存储 关系型数据库 MySQL
面试官:解释下什么是死锁?为什么会发生死锁?怎么避免死锁?
开局先来个段子: 面试官: 解释下什么是死锁? 应聘者: 你录用我,我就告诉你 面试官: 你告诉我,我就录用你 应聘者: 你录用我,我就告诉你 面试官: 滚!
|
数据可视化 Java
每日面试:经典死锁问题 | 如何解决死锁问题 | 多线程
每日面试:经典死锁问题 | 如何解决死锁问题 | 多线程
182 0
|
Java
【Java多线程】写一个死锁的例子
【Java多线程】写一个死锁的例子
111 0
|
安全 Java
不懂什么是锁?看看这篇你就明白了(四)
Java 中的锁有很多,可以按照不同的功能、种类进行分类,下面是我对 Java 中一些常用锁的分类,包括一些基本的概述
87 0
不懂什么是锁?看看这篇你就明白了(四)
|
SQL 算法 安全
不懂什么是锁?看看这篇你就明白了(一)
Java 中的锁有很多,可以按照不同的功能、种类进行分类,下面是我对 Java 中一些常用锁的分类,包括一些基本的概述
140 0
不懂什么是锁?看看这篇你就明白了(一)
|
Java 调度
不懂什么是锁?看看这篇你就明白了(五)
Java 中的锁有很多,可以按照不同的功能、种类进行分类,下面是我对 Java 中一些常用锁的分类,包括一些基本的概述
95 0
不懂什么是锁?看看这篇你就明白了(五)