【发布时间】:2021-12-05 15:56:38
【问题描述】:
所以我正在开发一个多线程 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()方法将元素添加到列表中?
【问题讨论】:
-
没有。
mlist在其自身内部同步,因此mlist.add有效地被synchronized (mlist) { ... }包围。 -
你说的同步列表是什么意思?
-
...换句话说,请扩展您的代码示例以显示列表是如何创建的。下面的答案和 Andy Turner 的评论似乎都假设是您通过调用
Collections.synchronizedList(...)创建的,但这是真的吗?当您说“同步列表”时,我们怎么知道您说的不是其他内容? -
@SolomonSlow 是的,我的意思是创建如下列表
List<Integer> mlist = Collections.synchronizedList(new ArrayList<Integer>());
标签: java multithreading synchronized