volatile读不是没有代价

12-11-19 banq
         

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

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

         

1
kof99
2012-11-19 13:57

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

banq
2012-11-24 07:49

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;
  }
}
<p>

比较下来结果,前者花费时间是:0.713189740 seconds time elapsed

后者花费时间是:3.271893871 seconds time elapsed

性能相差很多,有锁性能比较慢,关键原因是CPU的二级缓存需要同步。

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

SpeedVan
2012-11-29 13:19

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

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

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

michaelchan0921
2012-11-29 18:11

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