目录
- 4.7 wait notify
- 1、为什么需要wait
- 2、原理之wait/notify
- 3、API的介绍
- 4.8 wait notify 的正确姿势
- 4.9 Park & Unpark
- 4.10 重新理解线程状态转换
- 4.11 多把锁
4.7 wait notify
1、为什么需要wait
当持有锁的线程因为某种条件不能满足不能执行时,由于其持有锁,会其他线程也处于阻塞的状态,从而导致cpu的利用率降低。此时使用wait会使当前线程释放锁,进入waitset进行等待,等到条件满足再和其他线程来争夺锁,获取cpu的使用权
2、原理之wait/notify
见博客: https://blog.csdn.net/hc1285653662/article/details/131052585
3、API的介绍
见博客: https://blog.csdn.net/hc1285653662/article/details/131052585
4.8 wait notify 的正确姿势
4.9 Park & Unpark
1、基本使用
2、特点
3、原理之park \ unpark
见博客: https://blog.csdn.net/hc1285653662/article/details/131052585
4.10 重新理解线程状态转换
4.11 多把锁
一间大屋子有两个功能:床和学习桌,互不相干。
现在小南要学习,小女要睡觉,但如果只用一间屋子(一个对象锁)的话,那么并发度很低
解决方法是准备多个锁,床和学习桌都可以作为锁
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);
}
}
}
将锁的粒度细分
- 好处,是可以增强并发度
- 坏处,如果一个线程需要同时获得多把锁,就容易发生死锁