同步同步列表

时间:2016-09-27 10:30:19

标签: java multithreading

如果我有这样的代码片段 -

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

然后如果我在方法中做一些操作 -

boolean absent = !list.contains(x);             // Statement 1
if(absent)                                      // Statement 2
    list.add(x);                                // Statement 3

我是否需要将上述语句包含在synchronized(list){ ... }中以进行操作atomic

3 个答案:

答案 0 :(得分:3)

  

我是否需要将上述语句包含在synchronized(list){ ... }中以使操作成为原子?

是的,否则您的List可能会在您致电containsadd的时间窗内被修改,这可能会导致竞争条件问题。< / p>

  

这对我来说是什么用途   Collections.synchronizedList

Collections.synchronizedList使您的List线程安全,以便您可以同时修改它,但仍然以原子方式执行所有方法调用。在上面的情况下,您调用containsadd,您必须以原子方式执行,否则如果在其他地方我们调用addcontains的结果可能会过时,这会导致竞争条件问题。防止竞争条件问题的唯一方法是在同一个对象监视器上使用同步块,在您的情况下为list

答案 1 :(得分:2)

是的,同步列表使方法调用成为原子,但如果要使多个语句成为原子(例如,在遍历列表等时),则需要同步访问。

答案 2 :(得分:1)

正确。从理论上讲,你的陈述1和3之间可能发生任何事情;因此:如果你想要它们发生&#34; atomic&#34 ;;那么你需要一些方法将它们变成一个单一的交易&#34;。

使用synchronized(list)是达到目标的合理方式。