多个线程访问数组

3

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

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

这样可以吗?


这将在向数组添加数据时锁定包含addElem()的对象。 - helderdarocha
除了下面的答案,一旦您熟悉了这个,可以查看ReentrantReadWriteLock。在高性能情况下,读写锁是一种基本工具,您可以使用它来代替synchronized使用的普通互斥锁。读写锁允许多个线程同时读取,但只允许一个线程写入(并且在写入期间没有读取),这可以在并发读取可以无害完成的情况下提供更高的吞吐量。 - Jason C
3个回答

5

仅同步写入是不够的,您还需要同步读取。否则,与写入并发发生的读取可能会返回不一致的数据,或触发异常:

public synchronized String getFirst() {
    if (myArray.size() != 0)
        return myArray.get(0);
    return null;
}

您也可以使用Collections.synchronizedList
List<String> syncList = Collections.synchronizedList(new ArrayList<String>());

3

不行。如果您要访问列表,则需要同步所有访问时间,并确保不会将任何引用传递给其他地方。这就是同步类存在的原因-为了节省您的精力。这是答案的一部分,但不足够。


2

如果你的方法过长并且需要占用对象的时间太长,你可以使用同步块 synchronized(myArray) { // logic}。这比使用同步方法更可取。另一方面,synchronized 块只会在需要时保持对象锁定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接