如果我有这样的代码片段 -
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
?
答案 0 :(得分:3)
我是否需要将上述语句包含在
synchronized(list){ ... }
中以使操作成为原子?
是的,否则您的List
可能会在您致电contains
和add
的时间窗内被修改,这可能会导致竞争条件问题。< / p>
这对我来说是什么用途
Collections.synchronizedList
?
Collections.synchronizedList
使您的List
线程安全,以便您可以同时修改它,但仍然以原子方式执行所有方法调用。在上面的情况下,您调用contains
和add
,您必须以原子方式执行,否则如果在其他地方我们调用add
,contains
的结果可能会过时,这会导致竞争条件问题。防止竞争条件问题的唯一方法是在同一个对象监视器上使用同步块,在您的情况下为list
。
答案 1 :(得分:2)
是的,同步列表使方法调用成为原子,但如果要使多个语句成为原子(例如,在遍历列表等时),则需要同步访问。
答案 2 :(得分:1)
正确。从理论上讲,你的陈述1和3之间可能发生任何事情;因此:如果你想要它们发生&#34; atomic&#34 ;;那么你需要一些方法将它们变成一个单一的交易&#34;。
使用synchronized(list)
是达到目标的合理方式。