V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  amiwrong123  ›  全部回复第 28 页 / 共 40 页
回复总数  781
1 ... 24  25  26  27  28  29  30  31  32  33 ... 40  
2020-05-17 15:25:28 +08:00
回复了 amiwrong123 创建的主题 Java AQS 里 hasQueuedPredecessors 里为啥要先读取 tail 成员啊?
@xingda920813
这篇我看了,大概就是我图片里那个意思。 但需要考虑什么 happen-before 语义不呢
@adguy
@freebird1994
@gexyuzz
好吧,我发现我看错源码了,问了个 sb 的问题。此帖沉了。
@iffi
那如果修改 AtomicIntegerArray 为 private volatile int[] array,再修改 set 函数为 public final void set(int i, int newValue) {array[i] = newValue; } 。

这样是否可以保证 可见性 呢
@hoholiday
了解了啊。要知道大部分原子类,其数据成员都是 volatile 的,其 get 方法都是直接 return 成员,而不是通过 unsafe 对象 get 。
但原子数组类,在设计上就不一样了。
2020-05-10 17:50:02 +08:00
回复了 amiwrong123 创建的主题 Java AtomicStampedReference 的 CAS 操作,这么理解对吗
@orangex
理论上版本号应该越来越大,但这里提供的函数,就是随便设置版本号。

我也感觉后者不成立。因为 current 只是一个局部变量,就算线程切出去又切回来,此时 current 就变成了一个孤儿了(只有 current 局部引用指向它),假设其他线程 趁你切出去更新了 pair 对象。此时,pair 成员一定是新的 pair 对象。此时,再通过 casPair 判断,发现 current 局部变量就不是旧引用了。
@sioncheng
看了方法签名也是一脸懵啊,我都 System.in.close()了,那 System.in 这个 InputStream 此时感觉应该处于 the end of the stream is detected 的状态啊
@pursuer
这么说,有可能是哈。我还忘说自己的环境了,win10,jdk8.也许作者跑程序不是在 Windows 上跑的。
@SoloCompany
所以我那个线程,已经产生了 IllegalMonitorStateException,但我没 catch 住呗,所以没有打印。由于有异常没 catch 住,自然我那个线程也处于死亡状态了呗
@etoah
谢谢,大概明白了。比如,我可以 Entrance 里改成 synchronized(Entrance.getClass()) {//run 里面的所有逻辑},这样就可以了。

虽说这样改变程序的本意,Entrance 代表各个大门,那自然各个大门可以同时进入人,但这样改了,即使有五个大门,同一时刻,只能有一个大门可以进人。
@etoah
谢谢回答,你这么一理,确实是对上了。
把那个语句拆分成两句确实清楚了,还有就是拆分后的第二句的执行顺序,跟第一句的不一样的原因:是不是因为,线程之间没有互斥锁,所以执行顺序就是随机的(跟线程池有关吗)?

当然,每次打印结果都可能不一样,但至少,能用你的方法对上。
@hfc
哎,所以现在我就有点没看懂这个打印结果了。。
@hfc
不是吧,我感觉只有一个 Count 对象存在吧。作为一个静态域
@Aresxue
@daozhihun
@lance6716
各位大佬,可否再帮忙解答一个问题。
就是使用这个魔数只是为了哈希相对均匀的分布,那么如果不使用这个魔数,直接让静态变量 HASH_INCREMENT 为 1,会有什么坏处吗?(是不是因为 ThreadLocalMap 用的开发寻址,所以如果哈希均匀分布,那么冲突的时候,就能大概率更快的找到冲突后的新位置吗)
@daozhihun
嗯,我现在理解到了这点了。
@lance6716 #14
你这么说,倒真是哈。。。比如让 ThreadLocal 的那个静态变量 HASH_INCREMENT 为 1 。一样实现,2 的幂里完美散列的效果。
好吧,我错了。我好像想通了。
```java
import java.util.HashSet;
import java.util.Set;

public class MagicHashCode {
private static final int HASH_INCREMENT = 0x61c88647;

public static void main(String[] args) {
hashCode1();
}


private static void hashCode1(){
Integer length = 32;
int hashCode = 0;
for(int i=0;i<length;i++){
hashCode = i*HASH_INCREMENT;//每次递增 HASH_INCREMENT
System.out.print((hashCode & (16-1)) + " ");//求散列下标,算法公式
}
}

}
```
打印结果:0 7 14 5 12 3 10 1 8 15 6 13 4 11 2 9 0 7 14 5 12 3 10 1 8 15 6 13 4 11 2 9
结论:先创建 32 个 ThreadLocal,然后给线程 A 先设置第 1 个 ThreadLocal,再设置第 17 个 ThreadLocal,然后就冲突了
@lyjr
但是,ThreadLocalMap 里面的 key,如果个数大于了阈值,就会在 rehash 啊,然后容量变成下一个 2 的幂。也就不会出现你说的这种情况了啊
@lyjr
但是见此博客 https://www.cnblogs.com/dennyzhangdd/p/7978455.html 中的 MagicHashCode 测试类,利用魔数后,就算是取模后的 i,在有限的 2 的幂的哈希表,也没有一个 i 冲突啊。
2020-04-10 19:31:47 +08:00
回复了 zxc1234 创建的主题 程序员 关于面试准备(spring 与分布式)
@chihiro2014
感觉好视频的播放量而且还这么高
2020-04-07 09:38:22 +08:00
回复了 amiwrong123 创建的主题 程序员 初学 spring,各位大佬有什么推荐的路线吗
@watzds
是指 Spring+SpringMVC+MyBatis 啦
直接 boot 会不会略过太多细节,到头来还是得学 SSM
1 ... 24  25  26  27  28  29  30  31  32  33 ... 40  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1829 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 32ms · UTC 16:29 · PVG 00:29 · LAX 08:29 · JFK 11:29
Developed with CodeLauncher
♥ Do have faith in what you're doing.