java object多大 java对象内存模型 数组有多长(九)多线程2

背景:

多线程与单线程byte模式有误差,而且多线程每次跑出来不一样

 

发现:

多线程的代码一个线程一个执行是好的,证明Lists没问题

set多线程单线程没有误差,意味着除了byte那一块代码,其他的代码是可被信任的

单线程5000以下没有hash冲突时:byte==set==apache==理论值;基本证明了这套cas在单线程下没问题;hash冲突是导致单线程set和单线程byte误差的原因,冲突后byte更小,符合预期;

50000以内set单、多线程==理论值==apache,程序仍然是可以被信任的

与btye【】未被volatile无关

没有hash冲突时 byte单线程与多线程相同(不知道是不是巧合)

多线程常常比单线程byte大,像由并发 get both nothing both calculate导致的,还真发现了一个cas的错误,然而修复后还是有差距

此外发现一个小问题,int与不能>0,因为int不用于byte,有负数,与上一点一起用 

int mod = origin | (1 << posInt);
if (mod == origin)
throw new RuntimeException();

加固

最终突然想到多线程改变了hash冲突的顺序,继而影响后续递归路线,造成了甚至set访问总数的差别

目前冲突为232/10w = 0.232%

 

归根结底降低hash冲突, 有可能zing这种情况更多,所以导致reteined size和shallow size相差无几

 

改进:

1参考解决hash冲突方法
同时使用对象本身hashCode(要注意有负数,index计算要0-)降低为177/10w

收益不是很高,放弃

2 参考桶排序解决大数据排序

取hashcode n位,与identity混在一起,

当n=3时,降低为117/10w,收益也不高,放弃

posted on 2024-06-21 23:38  silyvin  阅读(1)  评论(0编辑  收藏  举报