以下同步 ArrayList
的代码片段能否在多线程环境中工作?
class MyList {
private final ArrayList<String> internalList = new ArrayList<String>();
void add(String newValue) {
synchronized (internalList) {
internalList.add(newValue);
}
}
boolean find(String match) {
synchronized (internalList) {
for (String value : internalList) {
if (value.equals(match)) {
return true;
}
}
}
return false;
}
}
我担心一个线程无法看到另一个线程的更改。
最佳答案
您的代码可以工作并且是线程安全的但不是并发的。您可能需要考虑使用 ConcurrentLinkedQueue
或其他并发线程安全数据结构,如 ConcurrentHashMap
或 notnoop 建议的 CopyOnWriteArraySet
并使用 contains
方法。
class MyList {
private final ConcurrentLinkedQueue<String> internalList =
new ConcurrentLinkedQueue<String>();
void add(String newValue) {
internalList.add(newValue);
}
boolean find(String match) {
return internalList.contains(match);
}
}
关于Java并发问题——在一个集合上同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2016511/