news 2026/9/1 19:57:14

JavaEE多线程(2)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JavaEE多线程(2)

1.死锁

1.1产生死锁四个必要条件

只要破坏其中一条就能打破死锁

1)互斥条件:锁是互斥的,同一时间只能一个线程拿到锁。

2)请求与保持:线程拿到一把锁,又申请另一把锁,并且不释放锁。

3)不可剥夺:锁只能自己主动释放,别的不可抢夺。

4)循环等待:线程a拿到锁1,申请拿锁2。线程2拿到锁2,申请拿锁1。形成了循环。

上述代码执行过程

首先t1先拿到锁lock1,并且进入睡眠,不释放lock1。

然后t2拿到锁lock2,也进入睡眠,不释放lock2。

当t1苏醒后在申请拿lock2,此时锁lock2已经被占用,会陷入堵塞。

当t2苏醒后在申请拿lock1,此时锁lock1已经被占用,会陷入堵塞。

此时陷入循环

输出结果如下,程序卡住不会结束

解决方法:我们可以对锁进行编号,任何一个线程在有多把锁的时候,加锁顺序由小到大加锁

此时输出可达到预期

2.volatile 关键字

volatile用来解决由于内存可见性引起的线程安全问题

什么是内存可见性问题?

实例:

在多线程中,每个线程有着自己的工作内存,不是直接读写主内存(存共享变量)

线程a修改了变量,但是只改在了自己的缓存里,没有同步到主内存中,线程b再从主内存中读取到的数据还是原来的

比如下述例子

解决上述方法就是给变量加上volatile 关键字

private staticvolatileboolean flag = false;

再加上后,修改flag值会立刻把修改后的值放回到主内存中并且清空其他线程的缓存副本

在读volatile变量时直接从主内存中读,不会从线程自己的工作缓存中读

保证了一个线程修改 volatile 变量,其他线程马上能读到最新值。

volatile三个作用

1)保证内存的可见性

2)禁止指令重排序

CPU / JVM 为了提升运行效率,在不改变单线程执行结果的前提下,会打乱代码执行顺序,这就叫指令重排序。

3)不保证原子性

3.wait 和notify

3.1wait()方法

wait()会使当前执行代码的线程进入等待队,并且会释放锁,等待唤醒

唤醒条件:其他线程调⽤notify⽅法。

wait(long millis)可以设置最大等待时间,时间到自动唤醒,不等 notify。

3.2notify()⽅法

notify()会随机唤醒等待队列中的线程

在notify()⽅法后,当前线程不会⻢上释放该对象锁,要等到执⾏notify()⽅法的线程将程序执⾏ 完,也就是退出同步代码块之后才会释放对象锁

notifyAll():唤醒该对象等待池全部线程

3.3代码演示

注意:必须在synchronized(obj){ }内部调用,否则直接抛异异常

执行结果

3.4wait 和sleep的对⽐

1)锁行为:

wait():释放锁,别的线程可以拿到这把锁。

sleep():抱着锁睡觉,如果在同步块里 sleep,其他线程拿不到锁,全部阻塞。

2)所属类

wait是Object实例对象的方法:lock.wait()

sleep是线程静态方法:Thread.sleep(1000)

3)唤醒区别

wait:要别的线程调用 notify /notifyAll 才会被唤醒;也可以被中断

sleep:时间到自己醒,不需要别的线程通知

3)位置

wait需要搭配synchronized使⽤.sleep不需要

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/1 19:49:29

DeepSeek Harness 上手实操:从装好到跑起来,再到插件管理,一篇全给你

如果你是个 AI Agent / 模型开发的人,最近应该没少听说 DeepSeek Harness。简单说,它是一个围绕 DeepSeek 模型打造的、可以自托管、能插件的智能体运行框架——所有能力都是插件,你想让它干什么,装个插件就行。 但网上的资料大多…

作者头像 李华
网站建设 2026/9/1 19:48:21

路面垃圾检测系统:Django+MySQL+YOLO深度学习实战解析

简介:这是一套面向计算机专业本科生的毕业设计级路面垃圾智能检测系统完整实现,基于Python深度学习与Django Web框架构建,解决城市环卫管理中垃圾识别效率低、任务闭环难的问题。资源包含1707个文件,涵盖63个核心Python模块&#…

作者头像 李华
网站建设 2026/9/1 19:47:12

Besiege中造三进制机械计算机:从三态编码到全加器实现

在 Besiege 里做机械三进制计算机,最容易产生“先试试”冲动的模块往往是全加器,因为它逻辑清晰、规模可控,又直接决定后续所有算术单元能否工作。真正动手之后会发现,三进制全加器不是简单换一张真值表,它要求整个信号…

作者头像 李华
网站建设 2026/9/1 19:45:15

残虹G键隐身进阶攻略:从躲怪到破隐一击的高效玩法

在“异环”这款游戏里,残虹的G键隐身技能,很多玩家可能只把它当成一个简单的躲怪或赶路工具。但我最近在“雾中朔望星回”活动里反复测试后发现,这个技能的正确用法远不止“按一下隐身”这么简单。它既能帮你绕过一些不必要的战斗&#xff0c…

作者头像 李华
网站建设 2026/9/1 19:44:43

单相与三相桥式逆变电路原理及Simulink仿真实战

关于 DC-AC 逆变电路,很多初学者一开始接触的是“桥式逆变”这个拓扑名称。单相桥和三相桥看起来只是开关管数量不同,但里面涉及导通逻辑、换相顺序、输出波形、谐波含量这些一连串问题。很多人做仿真时,模型搭好了波形却不对,或者…

作者头像 李华
网站建设 2026/9/1 19:44:35

用Python写网页监控脚本,自动盯住COMING SOON页面变化

看到 FansToys FT-63 TURBO COMING SOON! 这个标题,我的第一反应不是这个新品值不值得买,而是一个很适合写代码解决的场景:页面只停留在预告状态,之后什么时候放出参数、什么时候开放下单,官方不会主动通知你。与其每天…

作者头像 李华