volatile读不是没有代价

Are volatile reads really free?谈到如果为老线程安全加上volatile后,并不是免费的,与没有加volatile的性能对比如下:

写多花费100倍,读多花费25倍时间。

这么比较没意义吧, 应该把volatile 和 锁做个比较

2012-11-19 13:57 "@kof99"的内容
这么比较没意义吧, 应该把volatile 和 锁做个比较 ...

如你所愿,这篇是和Atomic比较:Java's Atomic and volatile, under the hood on x86

写得比较复杂,大概是先做没有volatile和atomic的试验,结果在多线程情况下无法得到正确结果。

然后使用compareAndSet无锁如下和volatile和atomic有锁比较。


public final int incrementAndGet() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return next;
}
}

比较下来结果,前者花费时间是:0.713189740 seconds time elapsed
后者花费时间是:3.271893871 seconds time elapsed
性能相差很多,有锁性能比较慢,关键原因是CPU的二级缓存需要同步。

多线程不一定比单线程快。更多并发并不意味着快。(这好像为Disruptor找了另外一个注解。)

2012-11-24 07:49 "@banq"的内容
如你所愿,这篇是和Atomic比较:Java's Atomic and volatile, under the hood on x86

写得比较复杂,大概是先做没有volatile和atomic的试验,结果在多线程情况下无法得到正确结果。 ...

我是这样理解的:其实无锁编程,是把锁交给硬件。将态变处理交给硬件来换取最大效率。CAS的处理方式可以用程序来实现(硬软本来就互通),既然硬件解决了,也就没必要再次处理了,而且语言处理远没有CAS快。

除了变量只需要单线程访问,否则多线程下,为了满足memory visible,至少要使用volatile吧