对于可变对象,生产者-消费者这种设计与阻塞队列一起,促进了串行线程封闭,从而将对象所有权从生产者交付给消费者。
线程封闭对象只能由单个线程拥有,通过安全地发布该对象“转移”所有权,实现了转移前由前一线程独占,转移后由后一线程独占。
阻塞队列使得这种线程封闭的所有权转移变得容易,其次还可以通过ConcurrentMap的原子方法remove或者AtomicReference的原子方法compareAndSet来完成这项工作。
栅栏与半锁的关键区别在于,所有线程必须都同时达到栅栏位置,才能继续执行。闭锁用于等待事件,而栅栏用于等待其它线程。
是一种两方栅栏,各方在栅栏位置上交换数据。如果一方通过exchange方法申请交换,而另一方还没有来,则会一直阻塞直至对方也提出申请。
最简单的方案是,当缓冲区被填满时,由填充任务进行交换,当缓冲区为空时,由清空任务进行交换。但是如果新数据的到达率不可预测,那么一些数据的处理过程就将延迟。另一个方法是,不仅当缓冲被填满时进行交换,并且当缓冲被填充到一定程序并保持一定时间后,也进行交换。
新闻热点
疑难解答