java单写多读

标签 java concurrency

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

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

最佳答案

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

根据您的使用情况,您可以使用非阻塞列表类,如 ConcurrentLinkedQueue。但是,考虑到您每隔几分钟就推送一项更改,我怀疑您是否通过避免同步来提高性能。

关于java单写多读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10097350/

相关文章:

java - 我们如何处理Java中float类型的溢出边缘情况?

java - Android Ping 命令在无法访问的服务器上死机

java - 对象序列化与字符串

java - 并发包中的阻塞队列方法;

java - LinkedBlockingQueue 是生产者消费者场景的正确选择吗?

c++ - 在action book并发中使用split reference count实现lock free stack

database - 支持多个并发用户的文件数据库建议

rest - 事件溯源 - 如何处理竞争条件和 http 传递?

java - Web Service调用的重试机制

C# - 图片问题