V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  22yune  ›  全部回复第 3 页 / 共 5 页
回复总数  100
1  2  3  4  5  
@Aresxue 是的

我是希望能通过分层 Hash 来解决这个问题。并不是依赖实现 hash 碰撞率极低的算法。

如在现有实现下,假设是 len=32 的 table 。当 hash 碰撞时,说明 hash 后面 5 位是相同的。如果 bin 再通过 hash 另外的 27 位,均匀分布的概率相比 32 位时应该会更大。

而且(我感觉很矛盾) 32 位时用 HashMap 平衡时间与空间,为何里面的 bin 不能用 HashMap,而用链表或红黑树?
@yeqizhang 我没有装 jdk7,看了下网上的文章及文中贴出的关键代码 transfer 方法。下面是我根据文章的理解。

关键代码 e.next = newTable[i]; newTable[i] = e;

transfer 中 table 是共享的,transfer 中只修改了 table 中 node 的 next 。next 会指向 newTable,newTable 也 可能 会通过 next 传播到线程外。

说可能是因为 线程 A 对 next 的修改不知道什么时候传播到线程 B 。线程 B 读到的 next 指向原来的 node,也可能指向线程 A 中 newTable 的 node 。

假设 table 中有一个 bin 是 a->b->c->null 。正常情况下,单线程 A 会把这个 bin 移到 newTable,变成 c->b->a->null 。

多线程情况下。线程 A 遍历到 b 了,产生的新链是 b->a->null 。

线程 B 开始遍历,这个时候线程 A 的修改还没传播到线程 B,所以线程 B 还是按 a->b->c->null 遍历。

当线程 B 移完了 a,新链是 a->null 。开始移 b 的时候,线程 A 的修改传播到线程 B 了,这时线程 B 就会按 b->a->null 遍历。

线程 B 按 b->a->null 遍历到 a 后,产生的新链就是 a->b->a 。这个就是环了。

即,正常按 a->b->c->null 遍历,翻转成 c->b->a->null ;多线程情况下,遍历到 b 时,变成按 a->b->a->null 遍历了。翻转的结果就是 a->b->a 了。

总结

单线程情况下 链表翻转了。多线程情况下,前面的线程正常翻转,后面的线程翻转到半途中链表已经变成了翻转后的,这时再翻转就是回头路了。
@Hurriance 链表也可以不加锁,如链表本身就是线程安全的。但这样得不偿失。

我说不需要加锁是从 ConcurrentHashMap 提供的接口语义看,key 之间没有关系,更新锁定 key 就可以了。

@iEverX
但实际用的链表导致 key 之间有关系,维护起来需要锁。如果某些情况( hash 碰撞但不完全相同)改用 ConcurrentHashMap 代替链表保存数据是不是有#4 说的更好的效果。

与数组是不同的,这个按 hash 分布的密度分布分配空间,不均匀分布。数组按 hash 范围分配空间,均匀分布。我假设是说明一个可以优化的场景,就像链表长度到 8 转红黑树,我的意思是说 hash 不完全相同转 map 。
@smilekung
但假设不用链表,也用 ConcurrentHashMap 呢?

不考虑 hash 完全相同的情况。也就是假设没有 hash 碰撞,是否可以完全不用锁?

就像现在的 ConcurrentHashMap 是每个 bin 一个锁,如果没有碰撞就是完全并发了。

我发现与 1.6 版本可以单个 segment 扩容不同,1.8 版本是整个表扩容。

我觉得在 hash 分布不均匀的时候,只在密度大的地方扩容,应该可以节省空间。

且用 map 替换链表应该也可以提高并发读。除非 hash 完全相同才用链表或红黑树。hash 不同时用 HashMap 是最快的。
@guyeu -_-|| 是 ConcurrentHashMap 。之前也有锁,segment 继承 ReentrantLock 。

之前是按 segment 锁的。segment 里面是 table 。jdk8 版本支持的并发度更高了。每个 bin 一个锁。

ConcurrentHashMap 对单个 KV 对的操作应该是不需要锁的(不同的 Key 之间是没有关系的,Map 只需保证对 KV 的 CURD,单个 Key 可以用 CAS 不需要锁),对 size 这种跨 Key 的接口提供的都是快照,不准确的。

我想是因为扩容才需要锁定,否则转移的时候会丢失。
@sagaxu 双写通过副本提供完整性的可靠性、校验和提供数据完整性验证的某种可靠性。

完整性与 可靠性是两码事。

双写 提供完整性的保证,不是提供完整性。MySQL 脏页刷新通过双写保证了页的完整性,不是页数据的完整性。数据的完整与双写提供的完整保证是不一样的吧?所以我形容成 完整性的可靠性。
@PureWhiteWu 是部分可靠吗?
@lhx2008 在规定的条件下,完成预定功能的能力?
2020-03-28 14:10:13 +08:00
回复了 22yune 创建的主题 程序员 计算机中 为何可以时间换空间或空间换时间?
@GeruzoniAnsasu #68 查表也是一个更简单的 y=f(x).
2020-03-28 09:59:46 +08:00
回复了 22yune 创建的主题 程序员 计算机中 为何可以时间换空间或空间换时间?
@jackchao7432 我感觉到被你嘲讽了。这个问题不能问吗?我是随便问问,有兴趣参与讨论下,没兴趣可以不用回复。
2020-03-28 09:53:39 +08:00
回复了 22yune 创建的主题 程序员 计算机中 为何可以时间换空间或空间换时间?
@wshwwl
1 、观点是 选择。
2 、观点是 转移。这个部分认同。前面图书馆的例子,是因为分类整理的时间转移了后面查找的时间还是制作书架的时间?

是我钻牛角尖了。
2020-03-28 09:47:44 +08:00
回复了 22yune 创建的主题 程序员 计算机中 为何可以时间换空间或空间换时间?
@www5070504 #33 我也觉得,就是突然有个念头,随便问问。

@xiaobai332 #36 就是这个 style

@favourstreet #37 没怎么看懂。门电路在时空不同位置没有区别,并没有回答问题吧?是 a 和 b 两种可能吗?(我没理解)

@cmdOptionKana #39 这个例子和#9 图书馆的列子类似。书不像衣服需要折叠。但也达到同样效果了。折叠不是问题点。

@yangzhezjgs #43 这个针对计算机好理解。你的意思是因为‘重复’。

@hoyixi @Blacate 这些列子直观的我没有一点疑问。但我对应不起来。我要对这些例子问‘为什么’。会不会有人想打我?_(:з」∠)_
2020-03-27 17:25:07 +08:00
回复了 22yune 创建的主题 程序员 计算机中 为何可以时间换空间或空间换时间?
@misdake 角度有点特别!选择 ?如#11 #12 的例子也都是选择吗?如果不知道那种方式就没有那个选择。就不能换?

下面回答的例子好像都是回答的怎么换,举例的。

我想问为什么能换?不是怎么换。

‘为什么能’和‘怎么做’ 好像是一样的。但在这里是不一样的。

就好像是可以做和为什么可以做。‘怎么做’对应‘可以做’,‘为什么能’对应‘为什么可以做’。

所以我是想问为什么可以换?不是怎么换可不可以换。
2020-03-27 17:20:15 +08:00
回复了 22yune 创建的主题 程序员 计算机中 为何可以时间换空间或空间换时间?
@misdake 角度有点特别!选择 ?如#11 #12 的例子也都是选择吗?如果不知道那种方式就没有那个选择。就不能换?
下面回答的例子好像都是回答的怎么换,举例的。我想问为什么能换?不是怎么换。‘为什么能’和‘怎么做’ 好像是一样的。但在这里是不一样的。就像是可以
2020-03-27 16:39:23 +08:00
回复了 22yune 创建的主题 程序员 计算机中 为何可以时间换空间或空间换时间?
@ayase252 放上书架并不能把空间换时间。需要分类了才能换时间?我可能是想问这个。为什么能换?
2020-03-27 16:32:36 +08:00
回复了 22yune 创建的主题 程序员 计算机中 为何可以时间换空间或空间换时间?
知道能换,知道怎么换的,就突然想问 为什么能换?
2020-03-27 16:30:43 +08:00
回复了 22yune 创建的主题 程序员 计算机中 为何可以时间换空间或空间换时间?
@woodensail 这个是类比 hashMap 过来的吗?我期待更深入的见解。dog:(
@laojiaqing 我也不知道我在问什么????????
2020-03-07 19:10:46 +08:00
回复了 Jinnrry 创建的主题 问与答 一个高并发架构问题,求指点
高并发一般瓶颈在共享资源。应先分析业务过程中哪些是共享的,哪些是可以并发的。
做到高并发的重点在把共享资源的抢占尽量减少。
建议在领任务前把任务分好批次,一个批次 50 个。加大了共享资源的粒度,使单次抢占做更多有效'功'。
2020-01-13 10:46:46 +08:00
回复了 22yune 创建的主题 职场话题 职场困惑:我该怎么办?
@loryyang 觉得你说的好有道理!感谢回复!帖子下沉!
2020-01-13 10:03:34 +08:00
回复了 22yune 创建的主题 职场话题 职场困惑:我该怎么办?
@lietoumai 感谢回复!看了各位 V 友的回复,突然感到回帖压力有点大。原因是人与人之间的交流真是太复杂。
并不是要反驳 V 友,都不喜欢被批评。我提出问题就是想接受 V 友有思考的评论(包括批评)。我感受到了你给我评论的用心,再次感谢!

下面给层主指出个逻辑问题作为回报,‘这’就是明证(自指):
‘楼主如果不能自己分析出以上逻辑,
证明楼主不是一个逻辑清晰并经验丰富的人,
楼主这样的能够提出完美方案,
我是持怀疑态度的。’
开始是假设(如果),下句就以假设做结论的(这样的)。

你说的‘暂时的’和‘真才实学的’,我觉得我领导都有,‘暂时的’不是违规的,是一些微妙的‘手段’,用‘策略’可能是更准确些,具体的我不说了(也说不清)。
关于评论其他内容的(类比、短语、最后)。这些让我反思我真正的问题是什么?在这里我补充澄清一下:题中‘三点兼得’与‘晋升不要杂事’是类似的。‘能做事、被认可、还不用拍马屁甩锅等应付职场问题(‘杂事’)(办公室手段)’的前两点与‘晋升’基本等义。这么一说,加深了我的困惑(感觉要职场环境的转变,个人能做什么?(否则只能适应环境)),能做的吗?
1  2  3  4  5  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5548 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 20ms · UTC 08:35 · PVG 16:35 · LAX 01:35 · JFK 04:35
Developed with CodeLauncher
♥ Do have faith in what you're doing.