我不确定我是否了解Java中的同步列表。假设我有以下内容:
List<Integer> numbers = Collections.synchronizedList(new ArrayList<Integer>());
// Assumption: This is running on a separate thread
public void add() {
numbers.add(new Random().nextInt(100));
}
// This is also running on a separate thread
public void doSomething() {
synchronized(numbers) {
for (int i : numbers) {}
}
}
基本上,add()
是否可以在调用doSomething()
时将数字添加到列表中?如果我改为使用public synchronized void add()
和public synchronized void doSomething()
?
我正在开发UDP套接字服务器,我打算将客户端存储在ArrayList
中。我会有多个线程可以读取,写入和修改此列表。我该怎么办?
答案 0 :(得分:2)
如果调用doSomething(),add()是否能够将数字添加到列表中?
不,直到线程调用doSomething()离开同步块。
如果我改为使用public synchronized void add()和public synchronized void doSomething()会怎么样?
假设这些是使用列表的唯一地方,效果将是相同的。但是您可以在包含列表的对象上同步,而不是在列表本身上进行同步。
基本上,对共享状态的所有访问必须在同一个锁上同步。您选择自己喜欢的锁。您可以使用像CopyOnWriteArrayList这样的并发集合,而不是使用同步列表或同步方法。
答案 1 :(得分:0)
这应该可以正常工作。根据{{3}}的文档,列表变换器方法(add()
等)在列表对象本身上同步。由于您的迭代循环也在synchronized
块内,所以一切都应该很好。