基于白嫖黑马程序员白嫖视频:全面深入学习java并发编程,java基础进阶中级必会教程
目录
- 1 Monitor主要结构
- 2 各自转化规则
- 3 API介绍(注意是对象的方法,不是线程)
- 4 wait(long t)和sleep(long t)的区别
- 5 wait/notify正确使用逻辑
1 Monitor主要结构
- Owner:正拥有对象的线程(RUNNABLE);
- EntryList:处于阻塞状态(BLOCKED)的等待Owner使用完对象的其他线程;
- WaitSet:当前线程发现自己条件不具备,调用wait方法,进入阻塞(WAITING)状态;
2 各自转化规则
- BLOCKED线程会在Owner线程释放锁时被唤醒;
- WATING线程会在Owner线程调用notify或者notifyAll时候被唤醒进入EntryList,BLOCKED状态,如果获得锁成功进入RUNNABLE状态;
3 API介绍(注意是对象的方法,不是线程)
- obj.wait:obj让线程进入Monitor的waitSet进行等待,线程进入WAITING状态;
- obj.notify:obj上正在做waitset中的线程,随机挑一个唤醒;
-
obj.notifyAll:让所有在obj上正在waitSet的线程唤醒;
前提:都必须获得了锁,才能调用这些方法。
4 wait(long t)和sleep(long t)的区别
- sleep是Thread的方法,wait是Object的方法;
- sleep不需要获得锁才能使用,但是wait必须要的synchronized一起使用;
- sleep在睡眠时不会释放锁,但是wait在等待时会释放锁;
- 都会使得线程进入TIMED_WAITING状态;
5 wait/notify正确使用逻辑
对于需要满足条件才继续执行的线程:
synchronized (lock){
while (!canDo){
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//条件成立,可以工作
System.out.println("工作--");
}
对于改变条件的线程,即通知别人的线程:
synchronized (lock){
canDo=true;
lock.notifyAll();
}
建议使用notifyAll()来实现。