我正在尝试在多个线程中使用arrayList,其中2个线程添加元素,而另一个线程只检索第一个元素。我知道我可以使用syncronizedList,但我想看看这种实现是否正确。基本上,我将所有数组操作都添加到同步方法中。
public void synchronized addElem(String str){
String s = str.trim();
myArray.add(s);
}
这样可以吗?
仅同步写入是不够的,您还需要同步读取。否则,与写入并发发生的读取可能会返回不一致的数据,或触发异常:
public synchronized String getFirst() {
if (myArray.size() != 0)
return myArray.get(0);
return null;
}
Collections.synchronizedList
。List<String> syncList = Collections.synchronizedList(new ArrayList<String>());
不行。如果您要访问列表,则需要同步所有访问时间,并确保不会将任何引用传递给其他地方。这就是同步类存在的原因-为了节省您的精力。这是答案的一部分,但不足够。
如果你的方法过长并且需要占用对象的时间太长,你可以使用同步块 synchronized(myArray) { // logic}
。这比使用同步方法更可取。另一方面,synchronized
块只会在需要时保持对象锁定。
ReentrantReadWriteLock
。在高性能情况下,读写锁是一种基本工具,您可以使用它来代替synchronized
使用的普通互斥锁。读写锁允许多个线程同时读取,但只允许一个线程写入(并且在写入期间没有读取),这可以在并发读取可以无害完成的情况下提供更高的吞吐量。 - Jason C