涉及的方法
1、wait(); 让线程处于冻结状态,被wait的线程会被存储到线程池中。 2、notify(); 唤醒线程池中的一个线程。 3、notifyAll(); 唤醒线程池中的所有线程。
这些方法都必须定义在同步中。因为这些方法是用于操作线程状态的方法,必须要明确到底操作的是哪个锁上的线程。
为什么操作线程的方法wait、notify、notifyAll定义在Object类中?
因为这类方法是监视器的方法,监视器其实就是锁。锁可以是任意的对象,任意的对象调用的方式一定定义在Object中。
生产者和消费者
多生产者、多消费者的问题。 while 判断标记。解决了线程获取执行权后,是否要运行。 notify 只能唤醒一个线程,如果本方唤醒本方,没有意义。 notifyAll 解决了本方程一定会唤醒对方线程的情况。 if 判断标记只有一次,会导致不该运行的线程运行了,出现数据错误的情况。 jdk1.5以后将同步和锁封装成了对象,并将操作锁的隐式方式定义到了该对象中,将隐式动作变成了显示动作。
Lock接口
出现替代了同步代码块或者同步函数,将同步的隐式锁变成现实锁操作。同时更为灵活,可以一个锁上多组监视 器。 lock(); 获取锁。 unlock(); 释放锁,通常定义finally代码块中。
Condition接口
出现了替代Object中的wait、notify、notifyAll方法。将这些监视器方法单独进行了封装,变成Condition监视器对象,可以和任意锁进行组合。 await(); Signal(): SignalAll();
wait和sleep的区别?
- wait可以指定时间也可以不指定。
- 在同步中时,对cpu的执行权和锁处理不同。wait:释放执行权,释放锁。sleep;释放执行权,不释放锁。