同步列表如何工作?

时间:2013-05-27 21:32:27

标签: java multithreading synchronization

我不确定我是否了解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中。我会有多个线程可以读取,写入和修改此列表。我该怎么办?

2 个答案:

答案 0 :(得分:2)

  

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

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

  

如果我改为使用public synchronized void add()和public synchronized void doSomething()会怎么样?

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

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

答案 1 :(得分:0)

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