当我们说ArrayList未同步时,这是什么意思?
这是否意味着如果我们在对象范围内声明一个ArrayList,访问对象的多个线程有机会修改列表?
答案 0 :(得分:11)
当我们说ArrayList未同步时意味着什么?
这意味着从多个线程访问ArrayList
实例可能不安全(读取,“可能导致意外行为”或“可能无法按照宣传的方式工作”)。
进一步阅读:
这是否意味着如果我们在对象范围内声明一个ArrayList,访问对象的多个线程有机会修改列表?
即使它是线程安全的,多个线程也能够修改列表。
不同之处在于,如果它不是线程安全的并且多个线程访问列表,则所有投注都将关闭。说这个类不是线程安全的,就像添加“如果一次从一个线程访问,这个方法如下工作......”在每个方法描述前面。
答案 1 :(得分:3)
同步与否,ArrayList总是可以被多个线程修改。同步是关于阻止并发访问。
对于ArrayList(或一般的集合),存在两个并发问题。
首先 ,有方法同步。这意味着,对ArrayList实例的方法的所有调用都是同步的。因此,一次只能执行一个方法。在第一个方法仍然计算时发生的所有其他方法调用都会排队,直到运行方法完成。
可以通过包装这样的ArrayList来确保方法同步:
List list = Collections.synchronizedList(new ArrayList());
示例:假设两个线程同时尝试执行以下操作:
list.add(0, "test");
如果您有同步列表,则可以保证后面的列表以两个“测试”条目开头。如果列表未同步,您可能会得到一个只包含一个“测试”条目的列表...或其他意外结果。
第二 ,有实例同步。这里我们不仅阻止并发方法调用,而且确保一段时间内只有一个线程可以访问列表对象。如果您有一些逻辑要求列表保持未更改状态直到逻辑完成,这一点很重要。例如,迭代列表。迭代列表时,您不希望其他线程添加元素。
这种同步是通过用同步块包装你的逻辑来完成的:
synchronized(list) {
for (Object o:list) {
...
}
}
答案 2 :(得分:1)
这是否意味着如果我们在对象范围内声明一个ArrayList,访问对象的多个线程有机会修改列表?
是。如果多个线程同时对其进行操作,则可能导致意外行为
答案 3 :(得分:1)
这意味着ArrayList的实例不保证是线程安全的。这通常包括读写访问。如果在没有外部同步的情况下执行此操作,则可以使对象处于stange状态并获得一些难以调试的行为。
答案 4 :(得分:0)
同步意味着每个操作都是线程安全的 - 如果同时使用两个线程中的相同Array List,它们就不会破坏状态。但是,这会让它变慢。
默认情况下,ArrayList未同步,您可以通过 synchronized 关键字
来实现ArrayList al=new ArrayList();
Collections.synchronized(al);
答案 5 :(得分:0)
保持同步意味着每个操作都是线程安全的-如果您同时使用两个线程中的相同向量,则它们不会破坏状态。但是,这会使速度变慢。
如果您在单线程环境中工作(或列表限制为线程且从不共享),请使用ArrayList。如果您正在使用共享同一集合的多个线程,请使用Vector或ArrayList,但以其他某种方式进行同步(例如,手动或通过包装器)。