传递给函数的列表是否可以由Java中的另一个线程修改?

Moc*_*cha 6 java multithreading

Integer getElement( List<Integer> list ) {

   int i = Random.getInt( list.size() );

   return list.get( i );

}
Run Code Online (Sandbox Code Playgroud)

问题:虽然这个函数是从一个线程调用的,但有一种方法传递给这个函数的列表可以被另一个线程修改吗?

dri*_*iis 8

list被传递到你的函数是一个列表对象的引用.如果任何其他线程都引用了相同的列表对象,那么这不是线程安全的.


卢声远*_* Lu 6

java.util.List不保证线程安全.该列表之间可以改变list.size(),并list.get()通过另一个线程.此外,内存不一致也是一个问题.

我可以想到三种解决方法:

  1. 使用不可变列表.Collections.unmodifiableList(list)很好,Guava的ImmuntableList更好.
  2. 同步列表.但是你必须在整个程序中同步列表实例.
  3. java.util.concurrent中列出.这是一个复杂的并发解决方案.

  • 这也行不通,因为另一个线程可以在不同步的情况下对其进行修改. (3认同)