java - 如何正确同步多个线程访问的列表?

标签 java list arraylist thread-safety synchronized

我有一个列表,每 20 毫秒在一个线程上更新一次,并每 16 毫秒在另一个线程上读取一次。我听说在这种情况下,通常最好使用同步列表而不是 copyonwritearraylist,对吗?

我应该将此列表初始化为

List<Object> list = Collections.synchronizedList(new ArrayList<Object>());

或者我应该将其设为常规列表,然后每次我想从中读取时使用诸如

之类的方法
public List<Object> synList(ArrayList<Object> list) {
    return Collections.synchronizedList(list);
}

抱歉,如果这很微不足道,我真的不确定。非常感谢

最佳答案

I have a list that is being updated on one thread every 20 ms and being read on another thread every 16 ms. I have heard that in a case such as this it is generally better to use a synchronized list and not a copyonwritearraylist, correct?

是的。

CopyOnWriteArrayList仅当读取次数多于写入次数时才真正有用,因此复制列表的成本会被更快的读取速度所抵消。

您的写入和读取次数大致相同,因此这不适用。

Should I initialize this list originally as List<Object> list = Collections.synchronizedList(new ArrayList<Object>()); ? or should I make it a regular list and then every time i want to read from it use a method...

第二个没用。

仅当对基础列表的所有访问也在同一事物上同步时,同步列表才有用;基本上,使用它的唯一安全方法是在创建时立即包装列表,即第一种方法。

关于java - 如何正确同步多个线程访问的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60029860/

相关文章:

python - 为什么当我将新元素附加到 TUPLE 时它会起作用?

java - 从文本文件中获取数字列表,转换为单个字符串,然后用空格或逗号将该列表拆分为两个数组列表

java - 一旦完成遍历 ArrayList,如何阻止该方法返回 null?

java - Docker为什么要杀死jvm?

python - 您如何计算列表中的最大重复次数?

java - 可执行 Jar 文件无法在另一台机器上运行

python - python 中的元组列表

java - 将图像数组传递到下一个屏幕

java - Hibernate双向父/子问题

java - 什么是元数据 GC 阈值以及如何调整它?