多个线程访问数组

时间:2014-02-23 02:35:44

标签: java android

我试图在多个线程中使用arrayList,其中2个线程向其添加元素,而一个线程只检索第一个元素。我知道我可以使用syncronizedList,但我想看看这个实现是否正确。基本上我在同步方法中添加了所有的数组操作

public void synchronized addElem(String str){
  String s = str.trim();
  myArray.add(s);
 }

这可以吗?

3 个答案:

答案 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阻止只会在需要时保持对象锁定。