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

时间:2011-08-02 10:20:17

标签: java arraylist synchronized

当我们说ArrayList未同步时,这是什么意思?

这是否意味着如果我们在对象范围内声明一个ArrayList,访问对象的多个线程有机会修改列表?

6 个答案:

答案 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,但以其他某种方式进行同步(例如,手动或通过包装器)。