public class Test{
HashMap<String, String> TempMap = null; public Test(){}

public HashMap Book1() throws Exception {
TempMap = new HashMap<String, String>();
TempMap.put("Book1","TestBook1");
......
return TempMap;
} public HashMap Book2() throws Exception {
TempMap = new HashMap<String, String>();
TempMap.put("Book1","TestBook2");
......
return TempMap;
}
}
请问以上代码 如果多个用户同一时间调用Book1()与Book2() 
那TempMap种的Book1得到的值会是什么??
都说HashMap是不安全型集合 
是不是指这种情况下的不安全????

解决方案 »

  1.   

    多个用户调用Book1()与Book2()?
    你是说多线程使用 对吧?
    如果你多个线程使用的是同一个Test实例对象的Book1()和Book2()方法,
    那么TempMap中的Book12种可能都有!  所谓的同时,其实还是有一定的时间间隔的!
    如果你多个线程操作的是不同的Test实例对象的话,那么调用哪个方法的那个线程将返回各自Test对象的TempMap,也就是说线程0出现"TestBook1",线程1出现"TestBook2",他们之间不会互相改变,因为对象根本都不同!所谓HashMap是不安全的集合,是因为程序效率的原因,取消了同步操作的synchronized方法!
    一般,我们所有些的方法都是异步操作,都是不安全的!
      

  2.   


    //第一种方法
    public class Test{
        HashMap<String, String> TempMap = null;    public Test(){}
        
        public synchronized HashMap Book1() throws Exception {
            TempMap = new HashMap<String, String>();
            TempMap.put("Book1","TestBook1");
            ......
            return TempMap;
        }    public synchronized HashMap Book2() throws Exception {
            TempMap = new HashMap<String, String>();
            TempMap.put("Book1","TestBook2");
            ......
            return TempMap;
        }
    }//第二种方法
    public class Test{    public Test(){}
        
        public synchronized HashMap Book1() throws Exception {
            HashMap<String, String> TempMap  = new HashMap<String, String>();
            TempMap.put("Book1","TestBook1");
            ......
            return TempMap;
        }    public synchronized HashMap Book2() throws Exception {
            HashMap<String, String> TempMap = new HashMap<String, String>();
            TempMap.put("Book1","TestBook2");
            ......
            return TempMap;
        }
    }
      

  3.   

    搞不懂,既然每次调用BookX函数,都会new一个Map对象,为什么还要赋值给一个
    类变量呢?
    如果有不同的线程分别调用book1和book2,那有可能book1返回的是book2中创建的map对象!
      

  4.   

    如果考虑多线程的话
    建议使用Hashtable
    Hashtable与HashMap类似,但Hashtable是线程安全的,而HashMap不是另:
      以上函数不用公有变量,每个里边都
      HashMap<String, String> TempMap = TempMap = new HashMap<String, String>();
      return TempMap即可返回其引用~~~~
      

  5.   

    ouyangyh的第二种方法 应该不需要synchronized了吧
    我在jsp里是这样调用的:
    Test t = new Test();
    ......//显示内容
    t.Book1();
    ......Test t2 = new Test();
    ......//显示内容
    t2.Book2();
    ......现在多个用户同一时间访问该页面  显示内容会不会互相混淆!???
      

  6.   

    关注 CSDN 好像没 “将帖子提前”的功能了???
      

  7.   

    每次调用Book1() 和Book2()都初始化新的hashmap对象。不会出现问题吧?不知道lz要实现什么功能! 
      

  8.   

    每次调用Book1() 和Book2()都初始化新的hashmap对象。不会出现问题吧?不知道lz要实现什么功能! 
      

  9.   

    public synchronized HashMap Book1() throws Exception {
            HashMap<String, String> TempMap  = new HashMap<String, String>();
            TempMap.put("Book1","TestBook1");
            ......
            return TempMap;
        }    public synchronized HashMap Book2() throws Exception {
            HashMap<String, String> TempMap = new HashMap<String, String>();
            TempMap.put("Book1","TestBook2");
            ......
            return TempMap;
        }
      

  10.   

    java.util.Map<String, String> tempMap = Collections.synchronizedMap(new HashMap<String, String>());
    创建支持线程安全的HashMap.
      

  11.   

    java.util.Map tempMap = Collections.synchronizedMap(new java.util.HashMap<String, String>());
    创建支持线程安全的HashMap.