Java等待/通知实现,无需同步
作者:互联网
我有一个场景,其中有数十个生产者和一个单一的消费者.时间至关重要:出于性能考虑,我希望避免生产者被锁定,并且希望消费者在没有消息准备就绪时尽可能少地等待.
我已经开始使用ConcurrentLinkedQueue,但是我不喜欢在queue.poll()== null时在使用者上调用sleep,因为我会浪费宝贵的毫秒数,并且我不想使用yield,因为我最终浪费了中央处理器.
因此,我来实现一种ConcurrentBlockingQueue,以便使用者可以运行以下内容:
T item = queue.poll();
if(item == null) {
wait();
item = queue.poll();
}
return item;
和生产者类似:
queue.offer(item);
notify();
不幸的是,等待/通知仅在同步块上起作用,这反过来会大大降低生产者的性能.是否有其他不需要同步的等待/通知机制的实现?
我知道与不等待和通知同步有关的风险,我设法通过运行以下外部线程来解决它们:
while(true) {
notify();
sleep(100);
}
解决方法:
I’ve started using a
ConcurrentLinkedQueue
, but I don’t like to call sleep on the consumer whenqueue.poll() == null
您应该检查the BlockingQueue
interface,它有一个take方法会阻塞,直到有可用的商品为止.
它具有javadoc中详细介绍的几种实现,但是ConcurrentLinkedQueue不是其中之一:
All Known Implementing Classes:
ArrayBlockingQueue, DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, LinkedTransferQueue, PriorityBlockingQueue, SynchronousQueue
标签:notify,locking,wait,semaphore,java 来源: https://codeday.me/bug/20191109/2012911.html