- 1.如果线程之间采用synchronized来保证线程安全,则可以利用wait()、notify()、notifyAll()来实现线程通信
- 2.wait()方法可以让当前线程释放对象锁并进入阻塞状态
- 3.notify: notify()方法用于唤醒一个正在等待相应对象锁的线程,使其进入就绪队列,以便在当前线程释放锁后竞争锁,进而得到CPU的执行
- 4.notifyAll: 用于唤醒所有正在等待相应对象锁的线程,使它们进入就绪队列,以便在当前线程释放锁后竞争锁,进而得到CPU的执行
- 5.这三个方法都不是Thread类中所声明的方法,而是Object类中声明的方法
- 6.原因是每个对象都拥有锁,所以让当前线程等待某个对象的锁,当然应该通过这个对象来操作
- 7.因为当前线程可能会等待多个线程的锁,如果通过线程来操作,就非常复杂了
- 8.这三个方法都是本地方法,并且被final修饰,无法被重写
- 9.每个锁对象都有两个队列,一个是就绪队列,一个是阻塞队列
- 10.就绪队列存储了已就绪(将要竞争锁)的线程,阻塞队列存储了被阻塞的线程
- 11.当一个阻塞线程被唤醒后,才会进入就绪队列,进而等待CPU的调度
- 12. 如果线程之间采用Lock来保证线程安全,则可以利用await()、signal()、signalAll()来实现线程通信
- 13.await()、signal()、signalAll()是Condition接口中的方法,该接口是在Java 1.5中出现的,它用来替代传统的wait+notify实现线程间的协作,它的使用依赖于 Lock
- 14.相比使用wait+notify,使用Condition的await+signal这种方式能够更加安全和高效地实现线程间协作
- 15.Condition依赖于Lock接口,生成一个Condition的基本代码是lock.newCondition()
- 16.Condition 的 await()/signal()/signalAll() 使用都必须在lock保护之内,也就是说,必须在lock.lock()和lock.unlock之间才可以使用
- 17.Conditon中的await()对应Object的wait(),Condition中的signal()对应Object的notify(),Condition中的signalAll()对应Object的notifyAll()。
- 18.BlockingQueue,Java 5提供了一个BlockingQueue接口,BlockingQueue是Queue的子接口,主要用途不是作为容器,是作为线程通信的工具
- 19.BlockingQueue的特征:当生产者线程试图向BlockingQueue中放入元素时,如果该队列已满,则该线程被阻塞;当消费者线程试图从BlockingQueue中取出元素时,如果该队列已空,则该线程被阻塞
- 20.程序的两个线程通过交替向BlockingQueue中放入元素、取出元素,即可很好地控制线程的通信
- 20.线程之间需要通信,最经典的场景就是生产者与消费者模型,而BlockingQueue就是针对该模型提供的解决方案
07-25