3

我不确定我是否理解 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()and会发生什么public synchronized void doSomething()

我正在开发一个 UDP 套接字服务器,我打算将客户端存储在一个ArrayList. 我将有多个线程可以读取、写入和修改此列表。我应该做什么?

4

2 回答 2

2

如果调用 doSomething(),add() 是否能够将数字添加到列表中?

不,直到调用 doSomething() 的线程离开同步块。

如果我改为使用 public synchronized void add() 和 public synchronized void doSomething() 会发生什么?

假设这些是唯一使用列表的地方,效果将是相同的。但是您会在包含列表的对象上进行同步,而不是在列表本身上进行同步。

基本上,对共享状态的所有访问都必须在同一个锁上同步。您选择您喜欢的锁。您可以使用像 CopyOnWriteArrayList 这样的并发集合,而不是使用同步列表或同步方法。

于 2013-05-27T21:39:37.143 回答
0

这应该可以正常工作。根据文档Collections.synchronizedList,列表修改器方法(add()等)在列表对象本身上同步。由于您的迭代循环也在一个synchronized块内,所以一切都应该很好。

于 2013-05-27T21:34:53.343 回答