编程语言
首页 > 编程语言> > Java等待/通知实现,无需同步

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 when queue.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