首页  >  问答  >  正文

java - HashMap中在项目中不用锁,使用什么方法可以把他改造成线程安全的?

在java中,Hashmap是线程不安全的,通过锁的机制和粒度,在源码中提供了HashTable和ConcurrentHashMap两种数据结构供使用,但是如果不使用锁,有什么方法将HashMap做到再业务中是线程安全的呢?

==========================================================================

我有一种思路是这样的:首先有一个map,再使用它的时候,将他赋值给一个新的map,我们叫他map',然后再将该map'做为key,存成一个新map。新map为Map<map',value>,这样每次添加的时候,是基于map'来添加的?

各路大神,还有没有其他思路呢?大家一起来讨论讨论哈。

PHPzPHPz2764 天前526

全部回复(6)我来回复

  • PHP中文网

    PHP中文网2017-04-18 09:50:14

    楼主说的方法是CopyOnWrite吧,主要思想就是操作的时候创建一个副本,但是可以参照JDKCopyOnWriteArrayList,其实它set操作的时候也是有加锁的,在遍历的时候用的是副本,所以不用加锁操作.因为如果不加锁的,最后的数据merge回去是一件头疼的事情(意味着,你在merge的时候肯定是要加锁的)

    回复
    0
  • 怪我咯

    怪我咯2017-04-18 09:50:14

    共享数据不用锁不能做到线程安全。你的方法复制那步线程不安全。
    要线程安全要么不共享,要么用锁

    回复
    0
  • 迷茫

    迷茫2017-04-18 09:50:14

    每次都操作的是一个副本, 那么每次处理结束之后如何保证所有线程可见? 而且如果基于map'进行添加, 那么就可能会带来数据库事务的问题, 比如不可重读, A线程添加后更新了map , B线程使用一个新的map'进行了覆盖; 如果不用保证线程可见性, 使用ThreadLocal进行变量局部化.

    回复
    0
  • 黄舟

    黄舟2017-04-18 09:50:14

    Collections.synchronizedMap(Map)
    就可以封装为线程安全的

    回复
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:50:14

    不使用锁无法做到线程安全。只是在于你的锁使用的有多高级。
    HashTable 因为是对象锁所有的操作都会同步,这是最基本的应用。
    ConcurrentHashMap 的锁就比较高级,因为在内部实现类似分区的功能,将不同的键存储在不同的区域,这实现就可同时多个线程操作ConcurrentHashMap,但是对于同一个区域的操作还是只能单线程操作(锁)。

    回复
    0
  • 大家讲道理

    大家讲道理2017-04-18 09:50:14

    Collections.synchronizedMap......?

    回复
    0
  • 取消回复