当我们说ArrayList不同步时,这意味着什么?
2022-09-02 01:35:26
当我们说ArrayList不同步时,这意味着什么?
这是否意味着如果我们在对象作用域中声明 ArrayList,则访问对象的多个线程有机会修改该列表?
当我们说ArrayList不同步时,这意味着什么?
这是否意味着如果我们在对象作用域中声明 ArrayList,则访问对象的多个线程有机会修改该列表?
当我们说ArrayList不同步时,这意味着什么?
这意味着从多个线程访问实例可能不安全(请阅读“可能导致意外行为”或“可能无法像宣传的那样工作”)。ArrayList
延伸阅读:
这是否意味着如果我们在对象作用域中声明 ArrayList,则访问对象的多个线程有机会修改该列表?
即使它是线程安全的,多个线程也可以修改列表。
不同之处在于,如果它不是线程安全的,并且多个线程访问列表,则所有赌注都已关闭。说该类不是线程安全的,与添加“如果一次从一个线程访问,此方法的工作原理如下.....”相同。在每个方法描述的前面。
无论是否同步,ArrayList 始终可以由多个线程修改。同步是关于防止并发访问。
使用ArrayList(或一般的集合)有两个并发问题。
首先,有方法同步。这意味着,对 ArrayList 实例的方法的所有调用都将同步。因此,一次始终只执行一个方法。在第一个方法仍在计算时发生的所有其他方法调用都将排队,直到运行的方法完成。
方法同步可以通过包装数组列表来确保,如下所示:
List list = Collections.synchronizedList(new ArrayList());
示例:假设两个线程尝试同时执行以下操作:
list.add(0, "test");
如果您有一个同步的列表,则可以保证列表后记以两个“测试”条目开头。如果列表未同步,您可能会得到一个只有一个“测试”条目的列表...或其他意外结果。
其次,有实例同步。在这里,我们不仅防止并发方法调用,而且确保一次只有一个线程可以访问 list 对象。如果您有一些逻辑片段要求列表在逻辑完成之前保持不变状态,这一点很重要。例如,循环访问列表。您不希望其他线程在您循环访问列表时添加元素。
这种同步是通过用同步块包装逻辑片段来完成的:
synchronized(list) {
for (Object o:list) {
...
}
}