很抱歉,如果之前有人问过这个问题,但我找不到我的确切场景。
目前我有一个后台线程,它每隔几分钟向列表添加一个元素并删除旧数据。理论上,列表中一次最多可以有 2 个项目,并且这些项目是不可变的。我还有多个线程,它们会在需要时获取列表中的第一个元素。在这种情况下,是否有必要显式地序列化列表上的操作?我的假设是,由于我只是获取对元素的引用,如果后台线程从列表中删除元素,那应该无关紧要,因为线程在删除之前已经获取了引用的副本。可能有更好的方法来做到这一点。提前致谢。
最佳答案
是的,这里还是需要同步,因为添加和删除不是原子操作。如果一个线程调用 add(0, new Object())
同时另一个线程调用 remove(0)
,结果是不确定的;例如,remove()
可能最终无效。
根据您的使用情况,您可以使用非阻塞列表类,如 ConcurrentLinkedQueue
。但是,考虑到您每隔几分钟就推送一项更改,我怀疑您是否通过避免同步来提高性能。
关于java单写多读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10097350/