Java并发API提供了一个同步辅助类---Exchanger,它允许并发线程之间交换数据。具体来说,Exchanger类允许在两个线程之间定义同步点(Synchronization Point)。当两个线程都达到同步点时,它们交换数据结构,因此第一个线程的数据结构进入到第二个线程中,同时第二个线程的数据结构进入到第一个线程。生产者VS消费者模型本质上就是两个线程交换数据。因此,对于只有一个生产。
ReentrantLock是一个可重入的互斥锁,又被称为"独占锁",ReentrantLock锁在同一个时间点只能被一个线程锁持有,而可重入的意思是,ReentrantLock可以被单个线程多次获取,ReentrantLock的性能并不高,优点是比价灵活。ReentrantLock比Synchronized关键词更加灵活,并且能支持条件变量,后面我还会单独介绍使用条件变量实现生产者消费者模型的方。
信号量是一种计数器,用来保护一个或者多个共享资源的访问。Java提供了Semaphore类来实现信号量机制。如果线程要访问一个共享资源,它必须先获得信号量。如果信号量的内部计数器大于0,信号量将减1,然后允许访问这个共享资源。计数器大于0意味着有可以使用的资源,因此线程将被允许使用其中一个资源。否则,如果信号量的计数器等于0,信号量将会把线程置入休眠直至计数器大于0.计数器等于0的时候意味着所有。
每个Java类都是从Object类派生出来的,Object类原生提供了wait(),notify(),notifyAll()等方法来实现线程间的同步控制。进一步讲,每个对象都能当做一个锁,每个对象也能当做一个条件队列,对象中的wait(), notify(), notifyAll()方法构成了内部条件队列的API,而队列正是生产者消费者模型的一个关键元素。当对象调用wait()方法时,当前线程会。