Java并发之wait()与notify()notifyAll()屌丝版

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章