目录
- 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);}}
}
将锁的粒度细分
- 好处,是可以增强并发度
- 坏处,如果一个线程需要同时获得多把锁,就容易发生死锁