论坛首页 入门技术论坛

Java集合 之 如何动态控制HashMap

浏览 8651 次
该帖已经被评为新手帖
作者 正文
   发表时间: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));

    }


}
 
   发表时间:2010-12-09   最后修改:2010-12-09
这个lockmap 既不外同步,lock之后又不进入阻塞状态,没有wait() 没有notify()

这也是锁么?

我小白了,没看懂这个map能解决什么问题,能让人学到什么...

有看懂的请帮忙解释一下...
0 请登录后投票
   发表时间:2010-12-09  
我这样做的目的是控制这个状态
0 请登录后投票
   发表时间:2010-12-09  
真没看出来是啥用途

1. lock 非原子变量
2. 没看到lock有任何set的地方。只看到判断lock了
0 请登录后投票
   发表时间:2010-12-09  
这个类还是线程不安全
0 请登录后投票
   发表时间:2010-12-09  
“该类的名字叫做ParameterMap”  VS. LockedMap

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

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

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

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

个人觉得不太适合作为一个 编程方法来让大家学习
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics