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

多把锁以及线程死锁问题

在 Java 中,每一个对象都可以作为一把锁,synchronized 通过获取对象头中的锁标志位来实现同步。当一个线程获取到对象的锁后,其他线程就无法再获取该锁,只能等待获取到锁的线程释放锁之后才能继续执行被 synchronized 修饰的代码块或方法。synchronized 本质上就是 Java 语言层面实现的一种互斥锁

背景

为了增加并发度,降低锁的粒度,增加多把锁;

一间大屋子有两个功能:睡觉、学习,互不相干。 现在小南要学习,小女要睡觉,但如果只用一间屋子(一个对象锁)的话,那么并发度很低 解决方法是准备多个房间(多个对象锁)

package cn.itcast.n4;import static cn.itcast.n2.util.Sleeper.sleep;import cn.itcast.n2.util.Sleeper;
import lombok.extern.slf4j.Slf4j;public class TestMultiLock {public static void main(String[] args) {BigRoom bigRoom = new BigRoom();new Thread(() -> {bigRoom.study();},"小南").start();new Thread(() -> {bigRoom.sleep();},"小女").start();}
}@Slf4j(topic = "c.BigRoom")
class BigRoom {private final Object studyRoom = new Object();private final Object bedRoom = new Object();public void sleep() {synchronized (bedRoom) {log.debug("sleeping 2 小时");Sleeper.sleep(2);}}public void study() {synchronized (studyRoom) {log.debug("study 1 小时");Sleeper.sleep(1);}}}

死锁问题

如果出现一个线程同时获取多把锁的情况,而且不是按照相同的顺序加锁的,可能会出现死锁问题

package cn.itcast.n4.deadlock;import lombok.extern.slf4j.Slf4j;import static cn.itcast.n2.util.Sleeper.sleep;@Slf4j(topic = "c.TestDeadLock")
public class TestDeadLock {public static void main(String[] args) {test1();}private static void test1() {Object A = new Object();Object B = new Object();Thread t1 = new Thread(() -> {synchronized (A) {log.debug("lock A");sleep(1);synchronized (B) {log.debug("lock B");log.debug("操作...");}}}, "t1");Thread t2 = new Thread(() -> {synchronized (B) {log.debug("lock B");sleep(0.5);synchronized (A) {log.debug("lock A");log.debug("操作...");}}}, "t2");t1.start();t2.start();}
}

定位

解决

按照相同的顺序加锁

相关文章:

  • Spring AI 实战:第三章、Spring AI结构化输出之告别杂乱无章
  • 【RocketMQ NameServer】- NameServer 启动源码
  • 如何设计抗Crosstalk能力强的PCB镀穿孔
  • 一种基于重建前检测的实孔径雷达实时角超分辨方法——论文阅读
  • ROS2安装简明教程
  • 算力经济模型研究:从云计算定价到去中心化算力市场设计
  • Linux时钟与时间API
  • spring2.x详解介绍
  • Power Query精通指南1:查询结构设计、数据类型、数据导入与迁移(平面文件、Excel、Web)
  • 爬虫准备前工作
  • AIGC时代——语义化AI驱动器:提示词的未来图景与技术深潜
  • WebAPI项目从Newtonsoft.Json迁移到System.Text.Json踩坑备忘
  • Java 反序列化
  • 从零开发一个B站视频数据统计Chrome插件
  • 音视频开源项目列表
  • vue的diff算法是什么、比较方式,原理分析、示例解释讲解
  • AI开源框架对比:PyTorch vs TensorFlow vs PaddlePaddle
  • 第一节:OpenCV 基础入门-简介与环境搭建
  • 【C++】:C++17新特性
  • [machine learning] Transformer - Attention (二)
  • 象屿集团:对去化压力大、市场有效需求不足区域坚决暂停投资,打造多元上市路径
  • 特朗普:对所有在国外制作进入美国的电影征收100%关税
  • 全国铁路迎来返程客流高峰,预计今日发送2040万人次
  • 习近平给谢依特小学戍边支教西部计划志愿者服务队队员的回信
  • 3:0战胜日本队,中国羽毛球队挺进2025苏迪曼杯决赛
  • 澎湃读报丨央媒头版头条集中刊发:大国应有的样子