本文主要是介绍3.9、多把锁,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
多把不相干的锁
一间屋子有两个功能:睡觉、学习,互不相干
现在小南要学习,小女要睡觉,但如果只用一间屋子(一把锁)的话,那么并发度很低
解决方法是准备多个房间(多个对象锁)
例如
@Slf4j(topic = "c.BigRoom")
class BigRoom {public void sleep() {synchronized (this) {log.debug("sleep 2小时");try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}}public void study() {synchronized (this) {log.debug("study 1小时");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}
执行
BigRoom bigRoom = new BigRoom();new Thread(() -> {bigRoom.sleep();},"小南").start();new Thread(() -> {bigRoom.study();},"小女").start();
输出
2022/03/06-18:11:07.948 [小南] c.BigRoom - sleep 2小时
2022/03/06-18:11:09.960 [小女] c.BigRoom - study 1小时
改进
@Slf4j(topic = "c.BigRoom")
class BigRoom {private final Object sleepRoom = new Object();private final Object studyRoom = new Object();public void sleep() {synchronized (sleepRoom) {log.debug("sleep 2小时");try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}}public void study() {synchronized (studyRoom) {log.debug("study 1小时");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}
输出
2022/03/06-18:13:35.248 [小南] c.BigRoom - sleep 2小时
2022/03/06-18:13:35.248 [小女] c.BigRoom - study 1小时
将锁粒度细分
- 好处、可以增强并发度
- 坏处、如果一个线程同时获得多把锁,就容易发生死锁
这篇关于3.9、多把锁的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!