`
he_wen
  • 浏览: 234336 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java集合 之 如何动态控制HashMap

    博客分类:
  • Java
阅读更多

本文章主要是控制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));

    }


}
 
分享到:
评论
22 楼 angel243fly 2010-12-12  
这个扩展hashmap估计用处不大吧
21 楼 he_wen 2010-12-10  
对,tomcat源代码是这样做的,怪我没有讲清
20 楼 hardPass 2010-12-10  
我终于搞明白了这个map的用途了。
就是说,把参数解析好,放入map后,就不允许修改这个map了。
是不是这个意思?
19 楼 sunce 2010-12-09  
的确,单纯控制访问,应用代理模式就OK了,
18 楼 rplees 2010-12-09  
在我印象中,锁这个东东应该会跟synchronized挂钩。
17 楼 dwangel 2010-12-09  
如果想得到一个不能修改 的Map,还是建议用
Collections.unmodifiableMap(originMap);

如果传递出去的map中途还需要修改,那只能说整体设计有点问题了。
16 楼 hardPass 2010-12-09  
he_wen 写道
这个类没有考虑线程安全问题,因为HashMap本来就是线程不安全。我主要做的就是限制HashMap值的操作。在Tomcat源码中就是这样做的,因为Servlet获取请求信息如:request.getParameterMap()时候,刚刚开始Tomcat是不会马上把字符串解析出来,而是存放字符串,只有用户调用了函数的时候它才会解析,在存放到HashMap中。。。呵呵。。。可能起的名字有误会,希望大家见谅!!!刚刚开始写博客有很多地方请指教


请问这个跟加lock有什么关系呢?
我老笨呢,想了半天没想明白。
15 楼 whaosoft 2010-12-09  
LZ大学专业是计算机吗?
14 楼 snake1987 2010-12-09  
有点像struts例的freeze

不过说真的,这题目真的……
13 楼 http4j 2010-12-09  
aabcc 写道
http4j 写道
我不觉得这个类很二, 楼主扩展的是HashMap,又不是ConcurrentHashMap,要那么多同步锁或者AtomicBoolean,未必适合楼主的场景。不理解说二的人都怎么想的?

lz提到了锁,但是既没有 同步块也没有lock-free算法

很容易让人误解啊,后面LZ的解释我算是明白一点点了

这个其实是 LZ看 How Tomcat works 得到的例子吧? 这个明显是 Tomcat的Custom解决方法,只适合TOMCAT的某场景

个人觉得不太适合作为一个 编程方法来让大家学习


这个楼主有责任,只不过说人家二的人明显没仔细看帖子,就上来攻击了。
楼主所说的所明显是控制访问用的,而不是多线程概念里的同步锁。

12 楼 he_wen 2010-12-09  
谢谢大家的回复,我当初是看了 How Tomcat works后,看到这个类比较好,才展示给大家看看,如果有不对的地方请大家多多指教。。。
11 楼 hhhhkkkk 2010-12-09  
个人看法,不要继承,可以Decorator或Proxy一个map类,这样灵活多了,还可以根据策略或其它方式封装不同的map实例,以实现有序,同步等功能。
10 楼 Wallian_hua 2010-12-09  
其实我不是说楼主,确实有点。。。。
9 楼 aabcc 2010-12-09  
http4j 写道
我不觉得这个类很二, 楼主扩展的是HashMap,又不是ConcurrentHashMap,要那么多同步锁或者AtomicBoolean,未必适合楼主的场景。不理解说二的人都怎么想的?

lz提到了锁,但是既没有 同步块也没有lock-free算法

很容易让人误解啊,后面LZ的解释我算是明白一点点了

这个其实是 LZ看 How Tomcat works 得到的例子吧? 这个明显是 Tomcat的Custom解决方法,只适合TOMCAT的某场景

个人觉得不太适合作为一个 编程方法来让大家学习
8 楼 http4j 2010-12-09  
我不觉得这个类很二, 楼主扩展的是HashMap,又不是ConcurrentHashMap,要那么多同步锁或者AtomicBoolean,未必适合楼主的场景。不理解说二的人都怎么想的?
7 楼 he_wen 2010-12-09  
这个类没有考虑线程安全问题,因为HashMap本来就是线程不安全。我主要做的就是限制HashMap值的操作。在Tomcat源码中就是这样做的,因为Servlet获取请求信息如:request.getParameterMap()时候,刚刚开始Tomcat是不会马上把字符串解析出来,而是存放字符串,只有用户调用了函数的时候它才会解析,在存放到HashMap中。。。呵呵。。。可能起的名字有误会,希望大家见谅!!!刚刚开始写博客有很多地方请指教
6 楼 sundoctor 2010-12-09  
这个真的没什么用,这个真的可以没有
5 楼 Foxswily 2010-12-09  
“该类的名字叫做ParameterMap”  VS. LockedMap

4 楼 finallygo 2010-12-09  
这个类还是线程不安全
3 楼 agapple 2010-12-09  
真没看出来是啥用途

1. lock 非原子变量
2. 没看到lock有任何set的地方。只看到判断lock了

相关推荐

Global site tag (gtag.js) - Google Analytics