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是不安全型集合
是不是指这种情况下的不安全????
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是不安全型集合
是不是指这种情况下的不安全????
你是说多线程使用 对吧?
如果你多个线程使用的是同一个Test实例对象的Book1()和Book2()方法,
那么TempMap中的Book12种可能都有! 所谓的同时,其实还是有一定的时间间隔的!
如果你多个线程操作的是不同的Test实例对象的话,那么调用哪个方法的那个线程将返回各自Test对象的TempMap,也就是说线程0出现"TestBook1",线程1出现"TestBook2",他们之间不会互相改变,因为对象根本都不同!所谓HashMap是不安全的集合,是因为程序效率的原因,取消了同步操作的synchronized方法!
一般,我们所有些的方法都是异步操作,都是不安全的!
//第一种方法
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;
}
}
类变量呢?
如果有不同的线程分别调用book1和book2,那有可能book1返回的是book2中创建的map对象!
建议使用Hashtable
Hashtable与HashMap类似,但Hashtable是线程安全的,而HashMap不是另:
以上函数不用公有变量,每个里边都
HashMap<String, String> TempMap = TempMap = new HashMap<String, String>();
return TempMap即可返回其引用~~~~
我在jsp里是这样调用的:
Test t = new Test();
......//显示内容
t.Book1();
......Test t2 = new Test();
......//显示内容
t2.Book2();
......现在多个用户同一时间访问该页面 显示内容会不会互相混淆!???
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;
}
创建支持线程安全的HashMap.
创建支持线程安全的HashMap.