我试图在多个线程中使用arrayList,其中2个线程向其添加元素,而一个线程只检索第一个元素。我知道我可以使用syncronizedList,但我想看看这个实现是否正确。基本上我在同步方法中添加了所有的数组操作
public void synchronized addElem(String str){
String s = str.trim();
myArray.add(s);
}
这可以吗?
答案 0 :(得分:5)
同步写入是不够的,您还需要同步读取。否则,与write同时发生的读取可能会返回不一致的数据,或触发异常:
public synchronized String getFirst() {
if (myArray.size() != 0)
return myArray.get(0);
return null;
}
您也可以使用Collections.synchronizedList
List<String> syncList = Collections.synchronizedList(new ArrayList<String>());
答案 1 :(得分:3)
没有。您需要在访问列表的所有时间同步,并确保您不在其他地方传递对它的任何引用。这就是同步类存在的原因 - 为您节省成本。这是答案的一部分,但还不够。
答案 2 :(得分:2)
您还可以将同步块用作synchronized(myArray) { // logic}
。如果您的方法太长并且将长时间保留所需对象,则优先于同步方法。另一方面,synchronized
阻止只会在需要时保持对象锁定。