0、wait()是Object中的方法,其中JDK1.8中,是有重载了三个,不过调用来调用去,最终还是调用了native的wait()方法
wait(long timeout)为native方法
1、notify()为Object下的native方法
@HotSpotIntrinsicCandidate
public final native void notify();
2、notifyAll()同样为Object下的native方法
@HotSpotIntrinsicCandidate
public final native void notifyAll();
3、有native方法, 就不得不提JNI(Java Native Interface)
这个决定单独拉一篇文章总结拉
4-0、当一个线程调用某一个对象的wait(),当前的线程就会释放掉对象锁,并处于WAITING状态(长期进入休闲娱乐区),同时也让出CPU时间片,直到另外一个线程调用同一个对象的notify、或者notifyAll方法,处于休闲娱乐区的当前线程才会继续参与对象锁的竞争
4-1、当一个线程执行某一个对象wait(timeout)方法后,释放掉持有的对象锁,会进入TIMED_WATING状态(限时进入休闲娱乐区),同时让出CPU时间片,timeout的时间到了后,处于休闲娱乐区的当前线程会继续参与对象锁的竞争(别的线程还没释放锁的话,当前线程会处于一直处于BLOCKED状态)
5-0、假设有多个线程都处于WAITING状态(多个人都在长期休闲娱乐区),那么另外一个持有对象锁的线程再调用notify方法的时候,只会随机唤醒休闲娱乐区中的一个线程(一个人),可以继续竞争对象锁
5-1、假设有多个线程都处于WATING状态(多个人长期处于休闲娱乐区),那么一个线程调用notifyAll方法的时候,会通知所有在休闲娱乐区的线程(所有人),继续参与对象锁的竞争
5-2、假设有多个线程都处于TIMED_WATING状态,要么到timeout时间自动唤醒,要么等别的线程执行同一个对象的notify或notify唤醒后,继续参与对象锁的竞争,牛逼
6、IllegalMonitorStateException: object not locked by thread before wai
IllegalMonitorStateException
终于踩到坑了,爽了,知识掌握不牢固的后果
https://bbs.csdn.net/topics/370105077
7、先回归一下线程的几个状态
a、NEW
b、RUNNABLE(ready和running)
c、BLOCKED
d、WAITING
e、TIMED_WAITING
f、TERMINATED
8、IllegalMonitorStateException,为啥会抛出这个异常呢
前提:需要线程先获得一个锁(对象锁、类锁都可以)为什么呢?
答:一个对象的wait()方法被当前线程执行时,当前线程会释放持有的对象锁,如果当前线程没有持有对象锁,那么你怎么释放一个对象锁呢,所以需要当前线程先获得一个对象锁
9、那么当前线程怎么获得对象锁呢?
答:使用synchronized关键字被,获得对象锁,类锁都可以(本身Class也是继承了Object嘛)
10、一个线程长期处于休闲足疗中,也没人通知,会怎么样?
答:彻底放弃CPU时间片,永远的休闲足疗下去……,大bug
总结:
保证多个线程操作的是同一个对象
a、获取同一个对象的锁
b、调用同一个对象的wait()或wait(timeout)方法
c、调用同一个对象的notify()、notifyAll()方法
再说一个过程,YY的过程:
a、线程first获得对象W的锁
b、线程first调用对象W的wait()方法,线程first让出CPU时间片,释放对象锁,同时自己不参与对象锁的竞争,进入WAITING状态(长期休闲足疗区)
c、线程second获得(处于BLOCKED状态)期盼已久的对象W的锁,开始处于RUNNABLE状态,开始执行里面的业务逻辑,调用对象W的notify()方法,随机通知休闲足疗区的一个线程可以进入BLOCKED状态,继续参与对象锁的竞争,假设就线程first一个人在,那就是唤醒它了
d、线程second的代码执行完毕,或者同样执行到wait()方法时会释放对象锁,线程first的机会就又来了…………
11、线程与线程之间的交互,真的是超级重要,WAIT、NOTIFY、NOTIFYALL