读<设计模式之Proxy(代理)>后有两个疑问。
1、原文中有一段对copy-on-write操作的context的描述如下:
比如:我们有一个很大的Collection,具体如hashtable,有很多客户端会并发同时访问它.其中一个特别的客户端要进行连续的数据获取,此时要求其他客户端不能再向hashtable中增加或删除 东东.
最直接的解决方案是:使用collection的lock,让这特别的客户端获得这个lock,进行连续的数据获取,然后再释放lock.
public void foFetches(Hashtable ht){
synchronized(ht){
//具体的连续数据获取动作..
}
}
但是这一办法可能锁住Collection会很长时间,这段时间,其他客户端就不能访问该Collection了.
HashTable本身不就是同步保证了吗?应该不存在还需要进行lock操作吧
2、最后解决办法中说:
这个特别的客户端先通过调用一个叫clone的方法来进行一系列数据获取操作.但实际上没有真正的进行对象拷贝,直至有其他客户端修改了这个对象Collection
如何实现直到别的客户更改了这个对象时才进行clone呢? 能给个例子吗?
Thanks!