java单写多读

java单写多读,java,concurrency,Java,Concurrency,很抱歉,如果以前有人问过这个问题,但我找不到确切的情况 目前,我有一个后台线程,它向列表中添加一个元素,并每隔几分钟删除一次旧数据。理论上,列表中一次最多可以有2个项目,并且这些项目是不可变的。我还有多个线程,每当需要时,它们都会抓取列表中的第一个元素。在这种情况下,是否需要显式序列化列表上的操作?我的假设是,由于我只是获取对元素的引用,因此如果后台线程从列表中删除元素,这应该无关紧要,因为线程在删除之前已经获取了引用的副本。也许有更好的方法可以做到这一点。感谢高级版。是的,这里仍然需要同步,因

很抱歉,如果以前有人问过这个问题,但我找不到确切的情况


目前,我有一个后台线程,它向列表中添加一个元素,并每隔几分钟删除一次旧数据。理论上,列表中一次最多可以有2个项目,并且这些项目是不可变的。我还有多个线程,每当需要时,它们都会抓取列表中的第一个元素。在这种情况下,是否需要显式序列化列表上的操作?我的假设是,由于我只是获取对元素的引用,因此如果后台线程从列表中删除元素,这应该无关紧要,因为线程在删除之前已经获取了引用的副本。也许有更好的方法可以做到这一点。感谢高级版。

是的,这里仍然需要同步,因为添加和删除不是原子操作。如果一个线程调用
add(0,newobject())
,而另一个线程调用
remove(0)
,则结果未定义;例如,
remove()


根据您的使用情况,您可能可以使用非阻塞列表类,如
ConcurrentLinkedQueue
。但是,考虑到您每隔几分钟就要进行一次更改,我怀疑您是否通过避免同步来获得更多性能。

如果多个线程捕获同一个“第一个元素”会有关系吗?如果线程A更改列表,而另一个线程B在更改后读取列表,即使两个线程都持有对列表的引用,你也不能保证B在没有同步的情况下会看到A所做的更改matters@assylias我忘了提到,我不在乎线程是否抓取过时数据,只要它抓取了什么。我的目标是让服务器永远不会因为这个简单的操作而崩溃,并强调性能=p这似乎是我所需要的。谢谢但是,在我的场景中,只有一个线程可以修改列表。这种情况还适用于我吗?正如@Russell所说,除非同步,否则更新列表不是原子的。只要有多个线程,并且至少有一个线程更改数据,就需要同步。