首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
华为云
V2EX  ›  程序员

一次 HashSet 所引起的并发问题

  •  4
     
  •   crossoverJie · 7 天前 · 1265 次点击

    一次 HashSet 所引起的并发问题

    大家都在说的 HashMap 并发问题居然真碰上了🤣.

    18 回复  |  直到 2018-11-09 16:59:40 +08:00
        1
    mortonnex   7 天前 via iPhone
    点赞
        2
    YAHIKO0   7 天前
    d=====( ̄▽ ̄*)b
        3
    crossoverJie   7 天前
    @YAHIKO0 #2

    兄弟你这颜表情是啥意思

        4
    jy02201949   7 天前
    @crossoverJie #3 智能送分机器人
        5
    YAHIKO0   7 天前
    点赞,
    @crossoverJie
        6
    coolcfan   7 天前 via Android
    可以直接 Collections.newSetFromMap(new ConcurrentHashMap ()),无缝替换掉,省掉手动写死 value
        7
    crossoverJie   7 天前
    @coolcfan #6

    嗯 本质上原理是一样的。
        8
    aimaodeyuer   7 天前
    追踪问题的能力还是要向大佬学习!
        9
    amon   7 天前
    点赞,这个问题只是理论上听到过,还真没看到过,哈哈。
        10
    Jokerrrrrr   7 天前
    分析排查的,有点厉害
        11
    Antidictator   7 天前
    点赞+1
        12
    TommyLemon   7 天前
    赞。
    我第一次看到 HashSet 的实现源码也震惊了,居然是用 HashMap 实现的,
    HashSet 里的所有 value 存到了 HashMap 里的所有 key,HashMap 的 value 则是全局的
    private static final Object PRESENT = new Object();
    文中用 ConcurrentHashMap 替代 HashSet 并写死 value 的做法,
    其实就是把 HashSet 简单地重新实现了一遍,并保证线程安全。
        13
    TommyLemon   7 天前
    @TommyLemon 至于形成环形链表的原因我看到问题就猜出来是
    多线程并发执行
    set.add(key)
    时同一个 key 被添加多次,然后导致
    valueI = key
    valueJ = key
    当循环里通过
    value = value.next
    形成了从 valueI 到 valueJ 的环形链表
        14
    BBCCBB   7 天前
    这..... 这难道不是常识吗?


    Collections.newSetFromMap(new ConcurrentHashMap<>())
        15
    crossoverJie   7 天前
    @TommyLemon #12

    是的,所以把实现的时候简单封装个类就可以了。
        16
    crossoverJie   7 天前
    @BBCCBB #14

    我确实是很少用 Collections.newSetFromMap 这个 API,有并发 set 要求都是用自己封装的 ConcurrentHashMap,不过原理都是一样的,不用过多纠结。
        17
    x66   7 天前
    感觉 Set 是为了去重,感觉 Redis 更适合干这事。
        18
    crossoverJie   7 天前
    @x66 #17

    Redis 当然可以。这本来就是个祖传代码,所以想最快的改造上线。

    加上其实我们的场景没必要用 Redis,就内存操作还更快。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3431 人在线   最高记录 3821   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 24ms · UTC 09:16 · PVG 17:16 · LAX 01:16 · JFK 04:16
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1