Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的线程安全队列_Java_Multithreading_Thread Safety_Queue - Fatal编程技术网

Java中的线程安全队列

Java中的线程安全队列,java,multithreading,thread-safety,queue,Java,Multithreading,Thread Safety,Queue,我想实现一个队列,它被多个线程命中 这是stack在单例类中 现在,一个简单的解决方案是同步这个?我想它需要这个作为标准? 然而,我想优先考虑写它 所以,写是高优先级的,读是低优先级的 这可能吗? 如果可能的话,理想情况下通过多个线程写入而不进行同步会很好。为什么要避免同步?编写“无锁”结构是可能的,但这相当棘手,而且很容易出错 如果我是你,我会使用ArrayBlockingQueue或ConcurrentLinkedQueue(或java.util.concurrent中的其他结构之一),让你

我想实现一个队列,它被多个线程命中

这是stack在单例类中

现在,一个简单的解决方案是同步这个?我想它需要这个作为标准? 然而,我想优先考虑写它

所以,写是高优先级的,读是低优先级的

这可能吗?

如果可能的话,理想情况下通过多个线程写入而不进行同步会很好。

为什么要避免同步?编写“无锁”结构是可能的,但这相当棘手,而且很容易出错

如果我是你,我会使用
ArrayBlockingQueue
ConcurrentLinkedQueue
(或
java.util.concurrent
中的其他结构之一),让你的生活变得轻松


哦,我错过了把读优先于写的一点。您可以使用
ReentrantReadWriteLock
类来实现这一点。然后,您就不需要线程安全队列了——您只需使用读写锁进行外部锁定,具体取决于您是在读还是在写。

为什么不使用
java.util.concurrent
中的内容呢?这绝非小事,尤其是在无锁的情况下。锁在现代JVM上的性能非常好,在写操作繁重的环境中,很容易击败基于事务重试的无锁解决方案。内置了
ConcurrentLinkedQueue
。进一步考虑,ArrayBlockingQueue看起来非常适合我的需要。我希望避免同步,因为我认为当我尝试放大系统上的线程(在本例中为用户)时,同步会导致显著的减速。停止思考,开始测量。:-)ArrayBlockingQueue的问题在于它很好地阻止了。如果您希望线程安全队列不受put()和take()的阻塞,该怎么办?@JohnMerlino您仍然可以使用offer()和poll(),它们是非阻塞的。