我试图提高对调用期间发出的锁定范围的理解。了解同步的行为
如:
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借来的)
在此代码段,可以一个线程调用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 *时,您根本无法保证其他线程添加的所有项目都具有“快照”。因此,据我可以看到,消除* synchronized *调用的副作用是现在代码被破坏了。除此之外,甚至有可能达到不一致的状态...... –