当我们说ArrayList不同步时,这意味着什么?

2022-09-02 01:35:26

当我们说ArrayList不同步时,这意味着什么?

这是否意味着如果我们在对象作用域中声明 ArrayList,则访问对象的多个线程有机会修改该列表?


答案 1

当我们说ArrayList不同步时,这意味着什么?

这意味着从多个线程访问实例可能不安全(请阅读“可能导致意外行为”或“可能无法像宣传的那样工作”)。ArrayList

延伸阅读:

这是否意味着如果我们在对象作用域中声明 ArrayList,则访问对象的多个线程有机会修改该列表?

即使它是线程安全的,多个线程也可以修改列表。

不同之处在于,如果它不是线程安全的,并且多个线程访问列表,则所有赌注都已关闭。说该类不是线程安全的,与添加“如果一次从一个线程访问,此方法的工作原理如下.....”相同。在每个方法描述的前面。


答案 2

无论是否同步,ArrayList 始终可以由多个线程修改。同步是关于防止并发访问。

使用ArrayList(或一般的集合)有两个并发问题。

首先,有方法同步。这意味着,对 ArrayList 实例的方法的所有调用都将同步。因此,一次始终只执行一个方法。在第一个方法仍在计算时发生的所有其他方法调用都将排队,直到运行的方法完成。

方法同步可以通过包装数组列表来确保,如下所示:

List list = Collections.synchronizedList(new ArrayList());

示例:假设两个线程尝试同时执行以下操作:

list.add(0, "test");

如果您有一个同步的列表,则可以保证列表后记以两个“测试”条目开头。如果列表未同步,您可能会得到一个只有一个“测试”条目的列表...或其他意外结果。

其次,有实例同步。在这里,我们不仅防止并发方法调用,而且确保一次只有一个线程可以访问 list 对象。如果您有一些逻辑片段要求列表在逻辑完成之前保持不变状态,这一点很重要。例如,循环访问列表。您不希望其他线程在您循环访问列表时添加元素。

这种同步是通过用同步块包装逻辑片段来完成的:

synchronized(list) {
      for (Object o:list) {
         ...
      }
}

推荐