2

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

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

4

1 回答 1

1

是的,这里仍然需要同步,因为添加和删除不是原子操作。如果一个线程add(0, new Object())同时调用另一个调用remove(0),则结果未定义;例如,remove()可能最终没有效果。

根据您的使用情况,您可能可以使用非阻塞列表类,例如ConcurrentLinkedQueue. 但是,鉴于您每隔几分钟就会推动一次更改,我怀疑您是否通过避免同步而获得了很大的性能。

于 2012-04-10T22:36:04.433 回答