论坛首页 入门技术论坛

ConcurrentHashMap真的有必要吗

浏览 14002 次
该帖已经被评为新手帖
作者 正文
   发表时间:2012-04-21  

ConcurrentHashMap真的有必要吗,很多时候我们用ConcurrentHashMap来保证操作map的过程达到线程安全,

但是跟多的时候map是用来存储临时数据例如User信息

 

假设在一个单例类里面设置了一个共享变量map作为存储User的集合,

 

你还有一个方法是用来操纵map里面的user例如:

 

public void a(){
  User user=map.get("1");

  user.xxxxxxx

  Thread.sleep(1000*5);

  map.put("1",user);

}

 为了明显看到效果,加上了线程sleep 5秒,a方法是非线程安全的。

 

我想知道的是,在这种情况下,这个map是否是线程安全有什么关系?ConcurrentHashMap能保证put、get操纵达到线程安全,但是只能局限于自身,对于这个方法、业务来说打不到线程安全的要求,map就算是线程安全的又有什么意义?

 

我的意思就好像一个球队输了,就算其中一个球员表现很抢眼又有什么意义?你说呢?

 

   发表时间:2012-04-21  
对ConcurrentHashMap来说真正有意义的方法是putIfAbsent之类的方法,楼主多看看JAVA DOC.
0 请登录后投票
   发表时间:2012-04-21  
ConcurrentHashMap是线程安全集合,但是我所说的是对于方法a来说,因为不是线程安全方法,map就不需要使用ConcurrentHashMap
0 请登录后投票
   发表时间:2012-04-22  

ConcurrentMap<String,String> map = new ConcurrentHashMap<String,String>();

if(!map.containsKey(key)){
    map.put(key,value);
}
 看起来很合理的,对于一个线程安全的Map实现,要存取一个不重复的结果,先检测是否存在然后加入。 其实我们知道两个原子操作和在一起的指令序列不代表就是线程安全的。 割裂的多个原子操作放在一起在多线程的情况下就有可能发生错误。
0 请登录后投票
   发表时间:2012-04-22  
putIfAbsent的重要意义在于原子操作,但是对于大多数逻辑上,我们充斥着这种 非原子操作,我们是否应在这些方法上面加上同步锁,

如果操作一个对象的有5个方法,是否这5个方法都加上锁才算是线程安全的编程
0 请登录后投票
   发表时间:2012-04-22  
接上面,由于操作map的这5个方法都没有同步,所以就算用了ConcurrentHashMap也是非线程安全的,反之如果这5个方法都实现了同步,那么map就算是使用hashmap也是线程安全的
0 请登录后投票
   发表时间:2012-04-22  
另外一点,通常一个业务类会操作多个这种共享变量,这种情况下是否直接在method上面加锁就可以了?还是即便如此,为了让锁的粒度达到最小,在各个业务方法里面自行决定锁的范围
0 请登录后投票
   发表时间:2012-04-22  
你绝得没必要,不用就是了。
0 请登录后投票
   发表时间:2012-04-22  
如果在多线程中,map 用ConcurrentHashMap还是有必要的, 如果不用, 就得在a方法中去同步
0 请登录后投票
   发表时间:2012-04-22   最后修改:2012-04-22
鹤舞白沙-我心飞翔 写道
你绝得没必要,不用就是了。


哦,*
0 请登录后投票
论坛首页 入门技术版

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