lzxz1234
2012-09-06 13:25

加上volatile 可以观察到,另“第一部分是由24字节的hash code和8字节的锁等状态标识组成”写错了吧?

wenkuany
2012-09-27 14:54

这个不只是java和C#有这个问题吧 这种填充的方法的确不用做一致性控制了 但是空间浪费不少哦

michaelchan0921
2012-10-26 12:10

自己测试了一下,的确如此:

volatile long:

duration = 58,185660258

duration = 56,183948170

volatile long with pad:

duration = 5,962906668

duration = 6,307130864

另外,使用volatile进行修饰,是不是为了放大效果:

These counters will be volatile longs so the world can see their progress.

还有一个疑问:false sharing应该在很多情况下都会出现,如何权衡?如果追究这点,很多代码都需要pad。

请banq老大帮忙看下

banq
2012-10-27 09:42

2012-10-26 12:10 "@michaelchan0921"的内容
volatile进行修饰,是不是为了放大效果 ...

是为了线程们彼此看见对方的修改后的值,这涉及线程工作原理,线程将主内存变量拷贝到自己工作内存中进行修改,各自修改后就彼此看不见对方的值了,用volatile是为让彼此看见。

pad问题应该都存在,是软硬结合的缝隙吧.

michaelchan0921
2012-10-27 09:59

原文中的false sharing的测试用例,实际上并不涉及到volatile,多个线程之间的值本来就是独立的。

即使去掉volatile,应该也能得出一样的结果,只是效果不是那么的明显。

但是这点,我还不确定,只能看作者写的,因为cache lines涉及到硬件原理,不懂 :(

[该贴被michaelchan0921于2012-10-27 10:00修改过]