Java中的线程安全队列

17

我想实现一个队列,能够被多个线程访问。

这个队列位于单例类中。

现在,简单的解决方案是同步它吗?我假设这是标准做法? 不过,我希望将写入操作优先考虑。

所以,写入是高优先级,读取是低优先级。

这是否可行? 如果可能的话,最好能够由多个线程进行写入而无需同步。


8
为什么不使用java.util.concurrent里的东西呢?尤其是无锁的情况下,这并不是一件简单的事情。在现代JVM上,锁的性能表现很好,在写入密集的环境中,基于事务重试的无锁解决方案可能会被锁轻易地超越。 - Marko Topolnik
1
有一个内置的ConcurrentLinkedQueue - fge
1个回答

26

你为什么要避免同步?虽然有可能编写“无锁”结构,但是这很棘手,容易出错。

如果我是你,我会使用 ArrayBlockingQueueConcurrentLinkedQueue(或者来自 java.util.concurrent 的其他结构),让你的生活更轻松!

哦,我忘记了关于优先读取而不是写入的部分。你可以使用 ReentrantReadWriteLock 类来实现。然后你就不需要一个线程安全的队列-只需根据是读还是写来外部锁定读写锁即可。


进一步思考,ArrayBlockingQueue看起来非常适合我的需求。我想避免同步,因为我认为当我尝试在系统上扩展线程(在这种情况下是用户)时,它会导致显着的减速。 - Matthew Smith
14
停止思考,开始衡量。 :-) - dty
1
ArrayBlockingQueue的问题在于它会阻塞。如果你想要一个线程安全的队列,但不希望由put()和take()引起阻塞,该怎么办呢? - JohnMerlino
1
@JohnMerlino 你仍然可以使用 offer() 和 poll() 这两个非阻塞的方法。 - Fabian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接