同步块是否阻止其他线程插入到同步列表中?



所以我正在开发一个多线程java应用程序,我有这个问题:

List<Integer> mlist = Collections.synchronizedList(new ArrayList<Integer>());
public void addStuff(int a){
mlist.add(a) // mlist is a synchronized list
}
public void traverseArray(){
synchronized(mlist){
// traversing mlist using normal for loop
}
}

在上面的代码中,如果一个线程试图使用addStuff()向mlist添加一个元素,另一个线程将被允许进入TraverseArray()方法中的同步块吗?反之亦然如果一个线程使用TraverseArray()方法中的同步块遍历列表,是否允许另一个线程使用addStuff()方法向列表添加元素?

需要在列表上同步

用户必须手动同步返回的数据

List list = Collections.synchronizedList(new ArrayList());
...
synchronized (list) {
Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}

因此可以推断,只要上述代码在同步块中,其他线程的修改就会被阻塞。

最新更新