大家都在说的
HashMap并发问题居然真碰上了🤣.
大家都在说的
HashMap并发问题居然真碰上了🤣.
|
mortonnexNov 9, 2018 via iPhone
1
点赞
|
|
YAHIKO0Nov 9, 2018
2
d=====( ̄▽ ̄*)b
|
|
3
|
|
jy02201949Nov 9, 2018
4
@crossoverJie #3
智能送分机器人 |
|
YAHIKO0Nov 9, 2018
5
点赞,
@crossoverJie |
|
coolcfanNov 9, 2018 via Android
6
可以直接 Collections.newSetFromMap(new ConcurrentHashMap ()),无缝替换掉,省掉手动写死 value
|
|
7
|
|
aimaodeyuerNov 9, 2018
8
追踪问题的能力还是要向大佬学习!
|
|
amonNov 9, 2018
9
点赞,这个问题只是理论上听到过,还真没看到过,哈哈。
|
|
JokerrrrrrNov 9, 2018
10
分析排查的,有点厉害
|
|
AntidictatorNov 9, 2018
11
点赞+1
|
|
TommyLemonNov 9, 2018
12
赞。
我第一次看到 HashSet 的实现源码也震惊了,居然是用 HashMap 实现的, HashSet 里的所有 value 存到了 HashMap 里的所有 key,HashMap 的 value 则是全局的 private static final Object PRESENT = new Object(); 文中用 ConcurrentHashMap 替代 HashSet 并写死 value 的做法, 其实就是把 HashSet 简单地重新实现了一遍,并保证线程安全。 |
|
TommyLemonNov 9, 2018
13
@TommyLemon 至于形成环形链表的原因我看到问题就猜出来是
多线程并发执行 set.add(key) 时同一个 key 被添加多次,然后导致 valueI = key valueJ = key 当循环里通过 value = value.next 形成了从 valueI 到 valueJ 的环形链表 |
|
BBCCBBNov 9, 2018
14
这..... 这难道不是常识吗?
Collections.newSetFromMap(new ConcurrentHashMap<>()) |
|
15
|
|
16
@BBCCBB #14
我确实是很少用 Collections.newSetFromMap 这个 API,有并发 set 要求都是用自己封装的 ConcurrentHashMap,不过原理都是一样的,不用过多纠结。 |
|
x66Nov 9, 2018
17
感觉 Set 是为了去重,感觉 Redis 更适合干这事。
|
|
18
|