同步块是否阻止其他线程访问对象?

Jim*_*mmy 5 java multithreading synchronization

如果我对同步块中的列表执行某些操作,是否会阻止其他线程在其他位置访问该列表?

List<String> myList = new ArrayList<String>();

synchronized {
  mylist.add("Hello");
}
Run Code Online (Sandbox Code Playgroud)

这是否会阻止其他线程迭代myList并删除/添加值?

我正在寻找从列表中添加/删除值,但同时保护它免受其他线程/方法的迭代(因为列表中的值可能无效)

sle*_*ske 12

不,不是的.

synchronized块仅阻止其他线程进入块(更准确地说,它阻止其他线程进入同一对象实例上同步的所有块 - 在这种情况下块同步this).

您需要在synchronized块中使用要保护的实例:

synchronized(myList) {
  mylist.add("Hello");
}
Run Code Online (Sandbox Code Playgroud)

整个区域在Java教程中得到了很好的解释:

http://download.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html