【发布时间】:2011-07-19 20:19:46
【问题描述】:
我有一个 personId 列表。有两个 API 调用来更新它(添加和删除):
public void add(String newPersonName) {
if (personNameIdMap.get(newPersonName) != null) {
myPersonId.add(personNameIdMap.get(newPersonName)
} else {
// get the id from Twitter and add to the list
}
// make an API call to Twitter
}
public void delete(String personNAme) {
if (personNameIdMap.get(newPersonName) != null) {
myPersonId.remove(personNameIdMap.get(newPersonName)
} else {
// wrong person name
}
// make an API call to Twitter
}
我知道可能存在并发问题。我阅读了大约 3 个解决方案:
-
synchronized方法 - 使用
Collections.synchronizedlist() CopyOnWriteArrayList
我不确定应该选择哪一个来防止不一致。
【问题讨论】:
-
我建议同步列表,而不是方法。在这种情况下,我肯定会避免使用
CopyOnWriteArrayList,因为它比变异更适合遍历。 -
从您的代码 sn-p 中,我不确定您是如何确定存在并发问题的?您不能删除一个项目,除非它是首先添加的,如果它已经在列表中,您也不能添加相同的项目。我想我想了解这里同时发生的事情。
-
myPersonId可以同时添加和删除,如果不同的线程调用上面的add和delete。
标签: java concurrency thread-safety