当前位置: 首页 > news >正文

【JavaEE】死锁是什么?如何避免死锁(保姆级讲解)

  • 博主简介:想进大厂的打工人
  • 博主主页:@xyk:
  • 所属专栏: JavaEE初阶

本篇文章将介绍什么是死锁,死锁的四大必要条件,如何去避免死锁~~~ 


目录

一、死锁是什么?

二、关于死锁的情况

2.1 一个线程的情况

2.2 两个线程的情况

2.2.1 形如这样的代码:

2.2.2 吃饺子

2.3 N个线程的情况

2.4 加锁代码

 三、如何避免死锁

3.1 死锁产生的四个必要条件

当上述四个条件都成立的时候,便形成死锁。当然,死锁的情况下如果打破上述任何一个条件,便可让死锁消失。其中最容易破坏的就是 "循环等待".

3.2 破坏循环等待:

四、相关面试题

4.1 谈谈 volatile关键字的用法?

4.2 Java多线程是如何实现数据共享的?

4.3 Java创建线程池的接口是什么?参数 LinkedBlockingQueue 的作用是什么?

4.4 Java线程共有几种状态?状态之间怎么切换的?

4.5 在多线程下,如果对一个数进行叠加,该怎么做?

4.6 Servlet是否是线程安全的?

4.7 Thread和Runnable的区别和联系?

4.8 多次start一个线程会怎么样

4.9 有synchronized两个方法,两个线程分别同时用这个方法,请问会发生什么? 

4.10 进程和线程的区别?


一、死锁是什么?

死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。
简单来说,死锁,就是没人能解锁了~~

举例:

我有个女神,我向女神表白了:女神I love you,她欣然同意,我就加锁成功了~~接下来,我换个微信小号,再偷偷加她一把,再在小号上也表白~~此时第二次尝试加锁,就不会成功了,我就只能阻塞等待~~

形如这样的代码:

 就是加锁俩次的情况,第二次尝试加锁,需要等待第一个锁释放;第一个锁释放,需要等待第二个锁加锁成功;

逻辑上矛盾了!!! ==>这就是死锁~~

二、关于死锁的情况

2.1 一个线程的情况

一个线程,一把锁(上面的情况),可重入锁没事,不可重入锁死锁;

 

2.2 两个线程的情况

两个线程,两把锁,即使是可重入锁,也会死锁~~

2.2.1 形如这样的代码:

 t1和t2线程在互相抢占锁,t1拥有了locker1再去竞争locker2,t2拥有了locker2再去竞争locker1,这样就形成了死锁~~

2.2.2 吃饺子

滑稽老哥和女神一起去饺子馆吃饺子,吃饺子需要酱油和醋.
滑稽老哥抄起了酱油瓶,女神抄起了醋瓶.
滑稽: 你先把醋瓶给我,我用完了就把酱油瓶给你.
女神: 你先把酱油瓶给我,我用完了就把醋瓶给你.
如果这俩人彼此之间互不相让,就构成了死锁.
酱油和醋相当于是两把锁,这两个人就是两个线程.

2.3 N个线程的情况

此时有N个线程,M把锁,线程数量和锁数量更多了,就更容易死锁了!!

比如哲学家,就餐问题:

 这五个哲学家:

1.随机的进行 吃面条(拿起筷子)和思考人生(放下筷子)

2.固执的,如果他想拿筷子,被别人占用了,就会等待;等的过程中不会放下手里已经拿到的筷子~~

假设这五个哲学家,同时拿起左手边的筷子!!!就死锁了!!

 

死锁是一种严重的 BUG!! 导致一个程序的线程 "卡死", 无法正常工作!!

那么实践中,如何去避免出现死锁呢??一个简单有效的方法就是,破解循环等待这个条件:

针对锁进行编号,如果需要同时获取多把锁,约定加锁顺序,必须是先对小的编号加锁,后对大的编号加锁~~~

约定,获取多把锁,先获取小的,后获取大的!!

只要约定了加锁顺序,循环等待自然破除,死锁就不会形成了!!

此时,5号老铁就可以先拿起两支筷子进行吃面,吃完了放下筷子,下一位老铁继续进行拿起筷子吃面,依次进行到最后一位老铁,就不会形成死锁~~

2.4 加锁代码

还是上面的代码,进行加锁顺序调整,就可以避免死锁了

 两个线程t1,t2都先对locker1进行加锁,就可以避免死锁了~~

 三、如何避免死锁

3.1 死锁产生的四个必要条件

死锁产生的四个必要条件:

  • 互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用
  • 不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。
  • 请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。
  • 循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路

当上述四个条件都成立的时候,便形成死锁。当然,死锁的情况下如果打破上述任何一个条件,便可让死锁消失。其中最容易破坏的就是 "循环等待".


3.2 破坏循环等待:

最常用的一种死锁阻止技术就是锁排序. 假设有 N 个线程尝试获取 M 把锁, 就可以针对 M 把锁进行编号(1, 2, 3...M)
N 个线程尝试获取锁的时候, 都按照固定的按编号由小到大顺序来获取锁. 这样就可以避免环路等待
可能产生环路等待的代码:

Object lock1 = new Object();
Object lock2 = new Object();
Thread t1 = new Thread() {
@Override
public void run() {
synchronized (lock1) {
synchronized (lock2) {
// do something...
}
}
}
};
t1.start();
Thread t2 = new Thread() {
@Override
public void run() {
synchronized (lock2) {
synchronized (lock1) {
// do something...
}
}
}
};
t2.start();

不会产生环路等待的代码:
约定好先获取 lock1, 再获取 lock2 , 就不会环路等待

Object lock1 = new Object();
Object lock2 = new Object();
Thread t1 = new Thread() {
@Override
public void run() {
synchronized (lock1) {
synchronized (lock2) {
// do something...
}
}
}
};
t1.start();
Thread t2 = new Thread() {
@Override
public void run() {
synchronized (lock1) {
synchronized (lock2) {
// do something...
}
}
}
};
t2.start();

四、相关面试题

4.1 谈谈 volatile关键字的用法?

volatile 能够保证内存可见性. 强制从主内存中读取数据. 此时如果有其他线程修改被 volatile 修饰
的变量, 可以第一时间读取到最新的值.

4.2 Java多线程是如何实现数据共享的?

JVM 把内存分成了这几个区域:
方法区, 堆区, 栈区, 程序计数器.
其中堆区这个内存区域是多个线程之间共享的.
只要把某个数据放到堆内存中, 就可以让多个线程都能访问到


4.3 Java创建线程池的接口是什么?参数 LinkedBlockingQueue 的作用是什么?

创建线程池主要有两种方式:

  • 通过 Executors 工厂类创建. 创建方式比较简单, 但是定制能力有限.
  • 通过 ThreadPoolExecutor 创建. 创建方式比较复杂, 但是定制能力强.
     

LinkedBlockingQueue 表示线程池的任务队列. 用户通过 submit / execute 向这个任务队列中添加任务, 再由线程池中的工作线程来执行任务

4.4 Java线程共有几种状态?状态之间怎么切换的?

  • NEW: 安排了工作, 还未开始行动. 新创建的线程, 还没有调用 start 方法时处在这个状态.
  • RUNNABLE: 可工作的. 又可以分成正在工作中和即将开始工作. 调用 start 方法之后, 并正在CPU 上运行/在即将准备运行 的状态.
  • BLOCKED: 使用 synchronized 的时候, 如果锁被其他线程占用, 就会阻塞等待, 从而进入该状态.
  • WAITING: 调用 wait 方法会进入该状态.
  • TIMED_WAITING: 调用 sleep 方法或者 wait(超时时间) 会进入该状态.
  • TERMINATED: 工作完成了. 当线程 run 方法执行完毕后, 会处于这个状态
     

4.5 在多线程下,如果对一个数进行叠加,该怎么做?

使用 synchronized / ReentrantLock 加锁
使用 AtomInteger 原子操作.


4.6 Servlet是否是线程安全的?

Servlet 本身是工作在多线程环境下.
如果在 Servlet 中创建了某个成员变量, 此时如果有多个请求到达服务器, 服务器就会多线程进行
操作, 是可能出现线程不安全的情况的.


4.7 Thread和Runnable的区别和联系?

Thread 类描述了一个线程.
Runnable 描述了一个任务.
在创建线程的时候需要指定线程完成的任务, 可以直接重写 Thread 的 run 方法, 也可以使用
Runnable 来描述这个任务


4.8 多次start一个线程会怎么样

第一次调用 start 可以成功调用
后续再调用 start 会抛出 java.lang.IllegalThreadStateException 异常


4.9 有synchronized两个方法,两个线程分别同时用这个方法,请问会发生什么? 

synchronized 加在非静态方法上, 相当于针对当前对象加锁.
如果这两个方法属于同一个实例:
线程1 能够获取到锁, 并执行方法. 线程2 会阻塞等待, 直到线程1 执行完毕, 释放锁, 线程2 获取到
锁之后才能执行方法内容.
如果这两个方法属于不同实例:
两者能并发执行, 互不干扰.

4.10 进程和线程的区别?


进程是包含线程的. 每个进程至少有一个线程存在,即主线程。
进程和进程之间不共享内存空间. 同一个进程的线程之间共享同一个内存空间.
进程是系统分配资源的最小单位,线程是系统调度的最小单位。
 

相关文章:

【JavaEE】死锁是什么?如何避免死锁(保姆级讲解)

博主简介:想进大厂的打工人博主主页:xyk:所属专栏: JavaEE初阶本篇文章将介绍什么是死锁,死锁的四大必要条件,如何去避免死锁~~~ 目录 一、死锁是什么? 二、关于死锁的情况 2.1 一个线程的情况 2.2 两个线程的情况…...

JS 实现占位符截取字符串内容

//charnum占位长度&#xff0c; //str 字符串内容 //返回charnum占位长度 下的字符串长度; function getcharlength(charnum,str){ var len 0; for (var i 0; i < str.length; i) { var c str.charCodeAt(i); //单字节加1 …...

Prophet学习(四)趋势Changepoints

目录 趋势Changepoints&#xff08;Trend Changepoints&#xff09; Prophet中的自动更改点检测&#xff08;Automatic changepoint detection in Prophet&#xff09; 调整趋势灵活性&#xff08;Adjusting trend flexibility&#xff09; 指定变更点的位置&#xff08;Spe…...

超表面学习 初步印象

超表面学习中 第一章 初步认识 一.传统超表面 1.吸波 2.反射相位 3.透射相位 4.电磁带隙 引申出来的超表面基础应用&#xff1a; 1.透波透镜&#xff08;对应透射相位&#xff09; 分为近场和远场 近场&#xff1a;贝塞尔波束等等 远场&#xff1a;方向图控制&#xff08;对应…...

脂肪肝 肾结石 怎么得来的

脂肪肝怎么得来的1.脂肪肝2.肾结石是如何产生的&#xff1f;1.脂肪肝 是由于肝细胞内脂肪堆积过多引起的慢性疾病&#xff0c;引起脂肪肝的因素有多种&#xff0c;由于常常没有自觉症状&#xff0c;往往不易引起人们的重视。常见原因有以下几种&#xff1a; 第一、过量饮酒&a…...

Python 进阶指南(编程轻松进阶):一、处理错误和寻求帮助

原文&#xff1a;http://inventwithpython.com/beyond/chapter1.html 请您不要将计算机当成佣人&#xff0c;因为这样会让您常常感觉很烦躁。比如说当计算机向您显示错误消息时&#xff0c;并不是因为您冒犯了它。计算机是我们大多数人都会接触到的最复杂的工具&#xff0c;但归…...

windows服务器自带IIS搭建网站并发布公网访问【内网穿透】

文章目录1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试3. Cpolar内网穿透3.1 下载安装Cpolar3.2 Cpolar云端设置3.3 Cpolar本地设置4.公网访问测试5.结语转载自远程源码文章&#xff1a;【IIS搭建网站】本地电脑做服务器搭建web站点并公网访问「内网穿透…...

IFPUG功能点度量4:度量事务功能

一、基本概念 1、事务功能 事务功能是处理数据功能的基本过程。 每个事务功能都是一个基本过程。 事务功能由多个逻辑处理来完成。 事务功能包含三种类型&#xff1a;EI、EO、EQ 2、基本过程 一个基本过程是由一个逻辑处理或者多个逻辑处理来完成的。 如何识别&#xf…...

未来公寓智能化设计平台项目(上)

目录 1. 项目背景 1.1 建设背景 1.2 建设依据 2. 未来公寓总体方案设计 2.1 建设目标 2.2 未来公寓服务平台总体架构 2.3 功能简介 2.4 方案优势 3. 社区基础数据中心建设 3.1 建设目标 3.1.1 统一数据资产技术架构 3.1.2 完善和规范数据相关标准 3.1.3 统一元数据…...

Java8新特性 Steam流

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。 Stream API可以极大提高Java程序员的生产力&#xff0c;让程序员写出高效率、干净、简洁的代码。 这种风格将要处理的元素集合看作一种流&#xff0c; 流在管道中传输&…...

Unity 实现大世界地图的技术原理

在游戏开发中&#xff0c;大世界地图是一种非常重要的场景&#xff0c;它可以让玩家在游戏中自由探索和移动。但是&#xff0c;实现大世界地图也面临着一些技术挑战&#xff0c;比如如何处理大量的地图数据、如何优化地图的加载和渲染等问题。在本文中&#xff0c;我们将介绍Un…...

jQuery制作一个简单的打地鼠游戏(超详细讲解)

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;老茶icon &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开兴好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;计…...

typora和C51开发环境

经过查阅&#xff0c;可以用wiz和typora联动的方式记录笔记&#xff0c;这样一个文件夹里既可以用typora也可以用内置编辑器&#xff08;一种富文本编辑器&#xff09;&#xff0c;注意同一个文件不能用不同的编辑器&#xff0c;否则会错乱。以下&#xff0c;我列举了用typora的…...

linux echo彩色打印

定义了三个颜色 把打印的内容加载头和尾巴之间即可 pt_head_green"\033[32;1m" pt_head_red"\033[31;1m" pt_head_yellow"\033[33;1m" pt_tail"\033[0m"echo "$pt_head_yellow | make clean |$pt_tail"...

2023年4月PMP®项目管理专业人士认证招生简章

PMP认证是Project Management Institute在全球范围内推出的针对评价个人项目管理知识能力的资格认证体系。国内众多企业已把PMP认证定为项目经理人必须取得的重要资质。 【PMP认证收益】 1、能力的提升&#xff08;领导力&#xff0c;执行力&#xff0c;创新能力&#xff0c;竞…...

Java每日一练(20230410)

目录 1. 二叉树的锯齿形层序遍历 &#x1f31f;&#x1f31f; 2. 从中序与后序遍历序列构造二叉树 &#x1f31f;&#x1f31f; 3. 平衡二叉树 &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专…...

主动配电网故障恢复的重构与孤岛划分统一模型研究【升级版本】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

TS2023年面试题汇总~~~~持续更新中!!!!

文章目录一、typescript 的数据类型有哪些二、TypeScript 中枚举类型的理解三、TypeScript 中接口的理解四&#xff0c; TypeScript 中类的理解五&#xff0c;TypeScript 中泛型的理解&#xff1f;六&#xff0c;TypeScript 中高级类型的理解&#xff1f;六&#xff0c;TypeScr…...

CSS模块的书写以及删除线的作用和来历什么是删除线

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>/*关羽这一行代码变为绿色*/#gy_li{color: green}/*张飞,苹果这一行代码变为黄色*/#zf_li,#pg_ul{color: yellow}/*i…...

Libhevc介绍

随着高清电视的普及和4K、8K超高清电视的出现&#xff0c;视频编解码技术也得到了广泛应用和发展。H.265/HEVC (High Efficiency Video Coding) 编解码标准作为一种新一代的视频编码技术&#xff0c;具有更高的压缩率和更好的画面质量&#xff0c;已经被成为未来视频编码的趋势…...

将HTML内容转换为Canvas图像,主流方法有效防止文本复制

HTML to Canvas 使用说明 项目概述 此项目实现了将HTML内容转换为Canvas图像的功能&#xff0c;可有效防止文本被复制。适用于需要保护内容的场景&#xff0c;如试题系统、付费内容等。 主要功能 防止复制: 将文本内容转换为Canvas图像&#xff0c;使用户无法选择和复制Mat…...

使用 Unstructured 开源库快速入门指南

引言 本文将介绍如何使用 Unstructured 开源库&#xff08;GitHub&#xff0c;PyPI&#xff09;和 Python&#xff0c;在本地开发环境中将 PDF 文件拆分为标准的 Unstructured 文档元素和元数据。这些元素和元数据可用于 RAG&#xff08;检索增强生成&#xff09;应用、AI 代理…...

数据湖是什么?数据湖和数据仓库的区别是什么?

目录 一、数据湖是什么 &#xff08;一&#xff09;数据湖的定义 &#xff08;二&#xff09;数据湖的特点 二、数据仓库是什么 &#xff08;一&#xff09;数据仓库的定义 &#xff08;二&#xff09;数据仓库的特点 三、数据湖和数据仓库的区别 &#xff08;一&#…...

Faiss向量数据库全面解析:从原理到实战

Faiss向量数据库全面解析&#xff1a;从原理到实战 引言&#xff1a;向量搜索的时代需求 在AI技术爆发的今天&#xff0c;向量数据已成为表示文本、图像、音视频等内容的核心形式。Facebook AI研究院开源的Faiss&#xff08;Facebook AI Similarity Search&#xff09;作为高…...

pikachu靶场通关笔记20 SQL注入03-搜索型注入(GET)

目录 一、SQL注入 二、搜索型注入 三、源码分析 1、渗透思路1 2、渗透思路2 四、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入百分号单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取…...

如何在没有 iTunes 的情况下备份 iPhone

我可以在没有 iTunes 的情况下将 iPhone 备份到电脑吗&#xff1f;虽然 iTunes 曾经是备份 iPhone 的主要方法&#xff0c;但它并不是 iOS 用户唯一的备份选项。您可以选择多种方便的替代方案来备份 iPhone&#xff0c;无需使用 iTunes。您可以在这里获得更灵活、更人性化的备份…...

2025年6月|注意力机制|面向精度与推理速度提升的YOLOv8模型结构优化研究:融合ACmix的自研改进方案

版本&#xff1a; 8.3.143(Ultralytics YOLOv8框架) ACmix模块原理 在目标检测任务中&#xff0c;小目标&#xff08;如裂缝、瑕疵、零件边缘等&#xff09;由于其尺寸较小、纹理信息稀疏&#xff0c;通常更容易受到图像中复杂背景或噪声的干扰&#xff0c;从而导致漏检或误检…...

ClusterRole 和 ClusterRoleBinding 的关系及使用

ClusterRole 和 ClusterRoleBinding 是 Kubernetes 中用于控制集群范围权限的两个重要资源&#xff0c;它们共同构成了 Kubernetes RBAC (基于角色的访问控制) 系统的核心部分。 两者的关系 ClusterRole 定义了一组权限规则&#xff0c;指定了可以对哪些资源执行哪些操作 Clu…...

【C++进阶篇】C++11新特性(下篇)

C函数式编程黑魔法&#xff1a;Lambda与包装器实战全解析 一. lambda表达式1.1 仿函数使用1.2 lambda表达式的语法1.3 lambda表达式使用1.3.1 传值和传引用捕捉1.3.2 隐式捕捉1.3.3 混合捕捉 1.4 lambda表达式原理1.5 lambda优点及建议 二. 包装器2.1 function2.2 bind绑定 三.…...

接IT方案编写(PPT/WORD)、业务架构设计、投标任务

1、IT 方案编写&#xff08;PPT/WORD&#xff09;​ 定制化方案&#xff1a;根据客户需求&#xff0c;提供涵盖云计算、大数据、人工智能等前沿技术领域的 PPT/WORD 方案编写服务&#xff0c;精准提炼核心价值&#xff0c;呈现专业技术内容。​ 逻辑清晰架构&#xff1a;采用…...