1. 线程通信中的方法wait,notify为什么写在Object类中
锁有关系,同步中的锁是一个对象,而是什么对象,不确定的,因此方法写在了顶层的父类中,无论哪一个对象作为锁,都可以使用线程的方法
2. wait方法和sleep方法有什么区别
Thread类的静态方法sleep 无论线程休眠多长时间,线程不丢失对象监视器,不放锁
wait方法,线程将发布对象监视器,释放锁,被唤醒后,从新获取锁后,才能运行。
3. 多线程的通信,多生产者和多消费者案例
有一个产品,生产一个,消费一个,生产者4线程,消费者4个线程
notify唤醒线程的时候,往往是最先等待的线程
线程从哪里等待,从哪里唤醒,也不能立即执行,进行标记的判断,如果标记允许生产,才能生产,允许消费才能消费
保证能够唤醒对方的线程 全部唤醒notifyAll
唤醒后,继续进行标记的判断 循环结构,线程继续判断标记
导致资源的严重浪费
唤醒了全部线程,浪费资源的
唤醒了本方线程,没有任何意义
做到唤醒对方中的一个呢?在JDK1.4版本之前,做不到
1.5版本之后,可以实现唤醒对方的一个线程
4. 在1.5版本的时候,出现了一个新的锁
新的锁,替换现在的同步机制 java.util.concurrent.locks包中,Lock接口
Lock接口,替换的同步,更加广泛和灵活的锁定操作
接口中的方法,lock()获取锁 unlock() 释放锁
synchronize(this){ == 获取锁
} == 释放锁
找子类 ReentrantLock 接口指向实现类的方式
既然同步没有了,this锁也就不存在了,替代品 java.util.concurrent.locks.Condition接口
Condition接口中的方法
await() == wait()
signal() == nofify()
signalAll() == notifyAll()
实现唤醒对方的一个线程,实现步骤:
导包
获取锁对象,Lock接口的实现类对象ReentrantLock
Lock接口中的方法lock() unlock()替换同步机制
获取Condition对象,对线程进行分组管理,使用Lock接口中的方法new Condition获取接口的实现类对象
利用Condition对象中的方法await signal实现等待与唤醒
|