多把不相干的锁
一间屋子有两个功能:睡觉、学习,互不相干
现在小南要学习,小女要睡觉,但如果只用一间屋子(一把锁)的话,那么并发度很低
解决方法是准备多个房间(多个对象锁)
例如
@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小时
将锁粒度细分
- 好处、可以增强并发度
- 坏处、如果一个线程同时获得多把锁,就容易发生死锁