hashmap 允许一个key为null,所以在getKey()时可以表示得到key值为null,或者表示查询不到key没有该键。所以在判断是否存在某个键的时候使用containsKey()进行判断,而hashtable不允许键-值为null。
重点:hashmap是不安全的,非同步。如果解决这一情况?
1.使用synchronized关键字(不用手动释放锁)
2.使用lock接口(必须手动释放锁,不然会造成死锁)
(1).lock接口有三个实现类,分别为ReentrantLock,和ReentrantReadWriteLock类中的静态内部类ReadLock和WriteLock。解锁建议放在finally块中
(2).在i/o流中同时进行读操作推荐使用ReadLock和WriteLock代码如下:``
public void run() {
nn.readLock().lock();
try {
FileInputStream is = new FileInputStream(url);
BufferedReader br = new BufferedReader(new InputStreamReader(is,"gbk"));
if((info = br.readLine()) !=null){
System.out.println(info); }
br.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}finally{
nn.readLock().unlock();
}
}
(3).使用lock进行锁的操作,对i/0,线程,hashmap均可,代码如下:
public void run() {
try {
//获取不到就会断开锁,并报InterruptedException;异常
n.lockInterruptibly();
} catch (InterruptedException e1) {
logger1.info("获取lock锁失败");
}
try {
FileInputStream is = new FileInputStream(url);
BufferedReader br = new BufferedReader(new InputStreamReader(is,"gbk"));
if((info = br.readLine()) !=null){
System.out.println(info); }
br.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}finally{
n.unlock();
}
3.使用ConcurrentHashMap(分布锁形式,锁当前调用的方法。)
4.使用Collections.synchronizedMap()包装一下,所有操作都加上synchronized关键字(不推荐:多个线程进入 判断containKey(key)外加remove(key),在线程处理完remove的时候,新进的现场可能会出现仍然判断key为true情况)