【问题标题】:How to properly synchronize a list being accessed by multiple threads?如何正确同步被多个线程访问的列表?
【发布时间】:2020-05-18 15:44:54
【问题描述】:

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

我应该把这个列表初始化为

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

?

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

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

对不起,如果这是微不足道的,我真的不确定。非常感谢

【问题讨论】:

  • 第一个选项。
  • 第二个没用。仅当对底层列表的所有访问也在同一事物上同步时,同步列表才有用;基本上,使用它的唯一安全方法是在创建时立即包装列表,即第一种方式。
  • @AndyTurner 有没有办法对这些同步列表/地图进行简单测试?
  • @Faraz 取决于您要测试的内容。
  • @AndyTurner 我会查一下。不过谢谢

标签: java list arraylist thread-safety synchronized


【解决方案1】:

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

是的。

CopyOnWriteArrayList 仅在您方式的读取多于写入时才真正有用,因此复制列表的成本被更快的读取所抵消。

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

我应该将此列表最初初始化为List&lt;Object&gt; list = Collections.synchronizedList(new ArrayList&lt;Object&gt;());吗?还是我应该将其设为常规列表,然后每次我想从中读取时使用一种方法...

第二个没用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多