【发布时间】:2011-12-13 09:07:52
【问题描述】:
我正在努力加深对synchronized 调用期间发出的锁定范围的理解。
例如:
class CopyOnReadList<T> {
private final List<T> items = new ArrayList<T>();
public void add(T item) {
items.add(item);
}
public List<T> makeSnapshot() {
List<T> copy = new ArrayList<T>();
synchronized (items) {
// Make a copy while holding the lock.
for (T t : items) copy.add(t);
}
return copy;
}
}
(代码亲切地从this excellent answer借来)
在这段代码sn-p中,一个线程可以调用add,而另一个线程调用makeSnapshot吗?即,synchronized (items) 创建的锁会影响对items 的所有尝试读取,还是仅影响通过makeSnapshot() 方法尝试的读取?
原帖实际上在add方法中使用了synchonized锁:
public void add(T item) {
synchronized (items) {
// Add item while holding the lock.
items.add(item);
}
}
去掉这个有什么副作用?
【问题讨论】:
-
如果您从 add 方法中删除 synchronized ,那么当您调用 makeSnapshot 时,您无法保证all 对其他线程添加的所有项目进行“快照”。因此,据我所知,删除 synchronized 调用的副作用是现在代码已损坏。除此之外,甚至可能达到不一致的状态......
标签: java concurrency