Java中的线程安全队列
我想实现一个队列,它被多个线程命中 这是stack在单例类中 现在,一个简单的解决方案是同步这个?我想它需要这个作为标准? 然而,我想优先考虑写它 所以,写是高优先级的,读是低优先级的 这可能吗?Java中的线程安全队列,java,multithreading,thread-safety,queue,Java,Multithreading,Thread Safety,Queue,我想实现一个队列,它被多个线程命中 这是stack在单例类中 现在,一个简单的解决方案是同步这个?我想它需要这个作为标准? 然而,我想优先考虑写它 所以,写是高优先级的,读是低优先级的 这可能吗? 如果可能的话,理想情况下通过多个线程写入而不进行同步会很好。为什么要避免同步?编写“无锁”结构是可能的,但这相当棘手,而且很容易出错 如果我是你,我会使用ArrayBlockingQueue或ConcurrentLinkedQueue(或java.util.concurrent中的其他结构之一),让你
如果可能的话,理想情况下通过多个线程写入而不进行同步会很好。为什么要避免同步?编写“无锁”结构是可能的,但这相当棘手,而且很容易出错 如果我是你,我会使用
ArrayBlockingQueue
或ConcurrentLinkedQueue
(或java.util.concurrent
中的其他结构之一),让你的生活变得轻松
哦,我错过了把读优先于写的一点。您可以使用
ReentrantReadWriteLock
类来实现这一点。然后,您就不需要线程安全队列了——您只需使用读写锁进行外部锁定,具体取决于您是在读还是在写。为什么不使用java.util.concurrent
中的内容呢?这绝非小事,尤其是在无锁的情况下。锁在现代JVM上的性能非常好,在写操作繁重的环境中,很容易击败基于事务重试的无锁解决方案。内置了ConcurrentLinkedQueue
。进一步考虑,ArrayBlockingQueue看起来非常适合我的需要。我希望避免同步,因为我认为当我尝试放大系统上的线程(在本例中为用户)时,同步会导致显著的减速。停止思考,开始测量。:-)ArrayBlockingQueue的问题在于它很好地阻止了。如果您希望线程安全队列不受put()和take()的阻塞,该怎么办?@JohnMerlino您仍然可以使用offer()和poll(),它们是非阻塞的。