volatile读不是没有代价
Are volatile reads really free?谈到如果为老线程安全加上volatile后,并不是免费的,与没有加volatile的性能对比如下:
写多花费100倍,读多花费25倍时间。
Are volatile reads really free?谈到如果为老线程安全加上volatile后,并不是免费的,与没有加volatile的性能对比如下:
写多花费100倍,读多花费25倍时间。
这么比较没意义吧, 应该把volatile 和 锁做个比较
如你所愿,这篇是和Atomic比较:Java's Atomic and volatile, under the hood on x86
写得比较复杂,大概是先做没有volatile和atomic的试验,结果在多线程情况下无法得到正确结果。
然后使用compareAndSet无锁如下和volatile和atomic有锁比较。
|
比较下来结果,前者花费时间是:0.713189740 seconds time elapsed
后者花费时间是:3.271893871 seconds time elapsed
性能相差很多,有锁性能比较慢,关键原因是CPU的二级缓存需要同步。
多线程不一定比单线程快。更多并发并不意味着快。(这好像为Disruptor找了另外一个注解。)
写得比较复杂,大概是先做没有volatile和atomic的试验,结果在多线程情况下无法得到正确结果。 ...
我是这样理解的:其实无锁编程,是把锁交给硬件。将态变处理交给硬件来换取最大效率。CAS的处理方式可以用程序来实现(硬软本来就互通),既然硬件解决了,也就没必要再次处理了,而且语言处理远没有CAS快。
除了变量只需要单线程访问,否则多线程下,为了满足memory visible,至少要使用volatile吧