李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
20.并发编程之多把锁问题
Leefs
2022-10-23 PM
1203℃
0条
[TOC] ### 一、背景介绍 现在有一个房子,在房子中有卧室和书房: + 书房可以用来学习 + 卧室可以用来睡觉 但是学习和睡觉两件事不冲突,不过学习和学习会出现冲突,睡觉和睡觉之间存在冲突。 ### 二、示例 > 当整个房子只有一把锁时 > > 现在t1线程要获取锁进房间学习,t2线程要进房间睡觉 ```java import lombok.extern.slf4j.Slf4j; /** * Created by lilinchao * Date 2022/10/23 * Description 多把锁 */ @Slf4j(topic = "c.Test03") public class Test03 { public static void main(String[] args) { BigRoom bigRoom = new BigRoom(); new Thread(() -> { bigRoom.study(); },"t1").start(); new Thread(() -> { bigRoom.sleep(); },"t2").start(); } } @Slf4j(topic = "c.BigRoom") class BigRoom { public void sleep(){ synchronized (this){ log.debug("sleeping 2 hour"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } public void study(){ synchronized (this){ log.debug("study 1 hour"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } ``` **运行结果** ``` 21:58:15.710 c.BigRoom [t1] - study 1 hour 21:58:16.712 c.BigRoom [t2] - sleeping 2 hour ``` **分析** t1和t2线程都想使用这个房子,但是t1线程先抢到锁,学习1小时后,t2才进入房子睡觉。 但是,学习和睡觉不存在互斥关系,两边不会相互干扰,应该同时可以获得这个房子的使用权, 我们该如何进行改进呢? ### 三、多把锁 > 同时创建睡觉和学习两把锁,每个人根据自己的需要进行上锁,互不干扰 ```java import lombok.extern.slf4j.Slf4j; /** * Created by lilinchao * Date 2022/10/23 * Description 多把锁-改进 */ @Slf4j(topic = "c.Test03") public class Test04 { public static void main(String[] args) { BigRoom2nd bigRoom = new BigRoom2nd(); new Thread(() -> { bigRoom.study(); },"t1").start(); new Thread(() -> { bigRoom.sleep(); },"t2").start(); } } @Slf4j(topic = "c.BigRoom2nd") class BigRoom2nd { private final Object studyRoom = new Object(); private final Object bedRoom = new Object(); public void sleep(){ synchronized (bedRoom){ log.debug("sleeping 2 hour"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } public void study(){ synchronized (studyRoom){ log.debug("study 1 hour"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } ``` **运行结果** ``` 22:03:55.851 c.BigRoom2nd [t2] - sleeping 2 hour 22:03:55.851 c.BigRoom2nd [t1] - study 1 hour ``` **分析** 从结果可以看出,t1和t2线程可以同时获得不同的锁同时执行。 ### 四、多把锁的优缺点 + **优点**:细分了锁的粒度,可以增强并发度 + **缺点**:如果一个线程需要同时获得多把锁,那就容易发生死锁
标签:
并发编程
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/2512.html
上一篇
19.并发编程之park与unpark基本使用
下一篇
21.并发编程之活跃性分析
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
MyBatis-Plus
Http
Shiro
正则表达式
Map
MyBatis
Docker
Zookeeper
Redis
Eclipse
国产数据库改造
pytorch
nginx
LeetCode刷题
哈希表
Typora
二叉树
Git
Linux
Hadoop
Spring
SpringCloudAlibaba
Beego
Thymeleaf
数据结构
Quartz
字符串
排序
SQL练习题
HDFS
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭