V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  amiwrong123  ›  全部回复第 25 页 / 共 37 页
回复总数  725
1 ... 21  22  23  24  25  26  27  28  29  30 ... 37  
@vitoliu
卧槽,无情~
2020-05-21 18:36:06 +08:00
回复了 amiwrong123 创建的主题 Java AQS 里的 setHeadAndPropagate 以及关于 PROPAGATE 信号的疑问?
我好后悔,我是不是应该弄个吸引人的标题的…
@hfc
是嘛,在 interrupt 的源码里能看到有调用 unpark 的吗
2020-05-17 20:18:30 +08:00
回复了 amiwrong123 创建的主题 Java AQS 里 hasQueuedPredecessors 里为啥要先读取 tail 成员啊?
@liangdu
>只是你对“语序逻辑是否依赖”没理解对而已,其实是有依赖的

我怎么看怎么赶脚 Node t = tail; Node h = head;这两句没啥依赖关系啊。

对了,我又突然想起来了,难道是这是两次 volatile 写操作,然后会在每次 volatile 写后面,加 StoreStore 和 StoreLoad 屏障,然后才能 这两句 不会被 指令重排序 ?是因为这个原因吗
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,然后就冲突了
1 ... 21  22  23  24  25  26  27  28  29  30 ... 37  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   904 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 28ms · UTC 19:37 · PVG 03:37 · LAX 12:37 · JFK 15:37
Developed with CodeLauncher
♥ Do have faith in what you're doing.