该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-12-08
本文章主要是控制HashMap权限如:设置一把锁(这里实现是通过一个布尔值locked)目的是想控制HashMap是否可以添加数据?是否可以清除数据?是否可以复制所有数据给另外一个HashMap? 如果布尔值为true,那么以上的操作都会报出异常。。。。
该类的名字叫做ParameterMap,它继承了HashMap类 。
请看下面的代码: 代码就不需要解释,因为里面已经解释的很详细,读者自己可以运行该程序。。。。 package ex09.pyrmont.startup; import java.util.HashMap; import java.util.Map; /** *第一次创建ParmaterMap实例是没有锁。 *该类继承了HashMap,包含了一个locked成员变量 * @author Jerry */ public final class LockedMap extends HashMap { // ----------------------------------------------------------- 构造函数 /** * 构造一个新的map,容量是默认值,加载因子也是默认值 */ public LockedMap() { super(); } /** * 构造一个新的map,容量值是一个具体的初始容量,加载因子是默认值 * * @param initialCapacity 这个map的初始容量 */ public LockedMap(int initialCapacity) { super(initialCapacity); } /** * 构造一个新的map,容量值是一个具体的初始容量,加载因子是loadeFactor * * @param initialCapacity 这个map的初始容量 * @param loadFactor 这个map的加载因子 */ public LockedMap(int initialCapacity, float loadFactor) { super(initialCapacity, loadFactor); } /** * 复制一个map,给新的map * * @param map Map的类容复制到新的Map中 */ public LockedMap(Map map) { super(map); } // ------------------------------------------------------------- 类的成员变量 /** * 这个Map当前锁的状态 */ private boolean locked = false; //------------------------------------------------------------get和set方法 /** * Return 这个map锁的状态. */ public boolean isLocked() { return (this.locked); } /** * 设置这个map锁的状态 * * @param locked 一个新锁的状态 */ public void setLocked(boolean locked) { this.locked = locked; } // --------------------------------------------------------- Public Methods /** * 移除这个map的所有键值对. * * @exception IllegalStateException 如果这个Map被锁住 */ public void clear() { if (locked) throw new IllegalStateException ("LockedMap.locked"); super.clear(); } /** * 在这个Map中具体的值与具体的键相关联。如果Map里面种包含了这个key,那么旧值就会被 * 替换 * * @param key Key是与具体的值相关联 * @param value 值必须与具体的key相关联 * * @return 具体key与之关联的value * * @exception IllegalStateException 如果这个Map被锁住 */ public Object put(Object key, Object value) { if (locked) throw new IllegalStateException ("LockedMap.locked"); return (super.put(key, value)); } /** * 把指定的map中的所有键值对复制到这个map中 * * @param map 所有的键值对存放在这个map中 * * @exception IllegalStateException 如果这个Map被锁住 */ public void putAll(Map map) { if (locked) throw new IllegalStateException ("LockedMap.locked"); super.putAll(map); } /** * 如果存在就会移除key相关联的value值. * * @param key * * @exception IllegalStateException 如果这个Map被锁住 */ public Object remove(Object key) { if (locked) throw new IllegalStateException ("LockedMap.locked"); return (super.remove(key)); } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-12-09
最后修改:2010-12-09
这个lockmap 既不外同步,lock之后又不进入阻塞状态,没有wait() 没有notify()
这也是锁么? 我小白了,没看懂这个map能解决什么问题,能让人学到什么... 有看懂的请帮忙解释一下... |
|
返回顶楼 | |
发表时间:2010-12-09
我这样做的目的是控制这个状态
|
|
返回顶楼 | |
发表时间:2010-12-09
真没看出来是啥用途
1. lock 非原子变量 2. 没看到lock有任何set的地方。只看到判断lock了 |
|
返回顶楼 | |
发表时间:2010-12-09
这个类还是线程不安全
|
|
返回顶楼 | |
发表时间:2010-12-09
“该类的名字叫做ParameterMap” VS. LockedMap
|
|
返回顶楼 | |
发表时间:2010-12-09
这个真的没什么用,这个真的可以没有
|
|
返回顶楼 | |
发表时间:2010-12-09
这个类没有考虑线程安全问题,因为HashMap本来就是线程不安全。我主要做的就是限制HashMap值的操作。在Tomcat源码中就是这样做的,因为Servlet获取请求信息如:request.getParameterMap()时候,刚刚开始Tomcat是不会马上把字符串解析出来,而是存放字符串,只有用户调用了函数的时候它才会解析,在存放到HashMap中。。。呵呵。。。可能起的名字有误会,希望大家见谅!!!刚刚开始写博客有很多地方请指教
|
|
返回顶楼 | |
发表时间:2010-12-09
我不觉得这个类很二, 楼主扩展的是HashMap,又不是ConcurrentHashMap,要那么多同步锁或者AtomicBoolean,未必适合楼主的场景。不理解说二的人都怎么想的?
|
|
返回顶楼 | |
发表时间:2010-12-09
http4j 写道 我不觉得这个类很二, 楼主扩展的是HashMap,又不是ConcurrentHashMap,要那么多同步锁或者AtomicBoolean,未必适合楼主的场景。不理解说二的人都怎么想的?
lz提到了锁,但是既没有 同步块也没有lock-free算法 很容易让人误解啊,后面LZ的解释我算是明白一点点了 这个其实是 LZ看 How Tomcat works 得到的例子吧? 这个明显是 Tomcat的Custom解决方法,只适合TOMCAT的某场景 个人觉得不太适合作为一个 编程方法来让大家学习 |
|
返回顶楼 | |