读<设计模式之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!

首先,你要问自己,你是在讨论J2SE语言语法 还是在学习一个无关乎语言的模式?

如果你确认后者,那么可以这样理解文中:我们有一个很大的集合,有很多客户端会并发同时访问它.其中一个特别的客户端要进行连续的数据获取,此时要求其他客户端不能再向集合中增加或删除 东东.

不要被技术细节或比喻误导。