hashtable 和hashmap的区别,如何使hashmap安全

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情况)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值