八月四日上午笔记

API

阻止自己:

在其他线程调用此对象的 notify() 方法或 notifyAll()方法前,导致当前线程等待
1.阻塞功能:
当在某线程中,对象上.wait(),在哪个线程中调用wait(),导致哪个线程处于阻塞状态
当某线程,因为调用执行某对象的wait()方法,而处于阻塞状态,我们说该线程在该对象上阻塞。
2. wait()方法的唤醒条件:
当某线程,因为某对象A的wait(),而处于阻塞状态时,如果要唤醒该线程,只能在其他线程中,在同一个对象上(即对象A),调用notify(),或者notifyAll()
即在线程的阻塞对象上,调用notify()或notifyAll() 方法,才能唤醒,在该对象上阻塞的线程。
3. 运行条件:
当前线程必须拥有此对象监视器,指synchronized代码块中的锁对象
即我们只能在当前线程所持有的synchronized代码块中的,锁对象调用wait方法,才能正常执行
4.执行特征 :
该线程发布(release 释放)对此监视器的所有权
并等待(阻塞)
注意:Thread的sleep方法,执行的时候:
该线程不丢失任何监视器的所有权

唤醒别人:

public final void notify();
唤醒在此对象监视器上等待的单个线程。
如果所有线程都在此对象上等待,则会选择唤醒其中的一个线程。
并且notify的选择是任意性的。

public final void notifyAll();
唤醒在此对象监视器上等待的所有线程。

**智能蒸笼方法:

  1. 实现生产者和消费者的线程同步,只需要将setFood 和eatFood方法编程同步方法即可;
    a.两个方法在两个线程中运行,而且他们的锁对象都是this
    b.这两个方法在生产者线程,和消费者线程,都是在同一个container对象上被调用
    c.所以这两个方法的this都是,同一个container对象,两个同步方法的锁对象也是同一个container对象
    2.实现生产者和消费者之间协作**
    八月四日上午笔记
    虚假唤醒:
    一个被唤醒的线程,实际上并不应该被唤醒(此时不满足该线程的执行条件),这种唤醒我们称之为虚假唤醒。为了一个线程被虚假唤醒的情况下,仍然能正确执行,必须在每次执行前都判断是否满足执行条件。