Java比较和交换语义与性能
Java中比较和交换的语义是什么?也就是说,Java比较和交换语义与性能,java,performance,concurrency,jvm,compare-and-swap,Java,Performance,Concurrency,Jvm,Compare And Swap,Java中比较和交换的语义是什么?也就是说,AtomicInteger的比较和交换方法是否只保证不同线程之间对原子整数实例的特定内存位置的有序访问,还是保证对内存中所有位置的有序访问,即,它的行为就好像它是一个易失性(内存围栏)一样 从: weakCompareAndSet以原子方式读取和有条件地写入变量,但不会在排序之前创建任何事件,因此对于除weakCompareAndSet目标之外的任何变量的先前或后续读取和写入不提供任何保证 compareAndSet和所有其他读取和更新操作,如get
AtomicInteger
的比较和交换方法是否只保证不同线程之间对原子整数实例的特定内存位置的有序访问,还是保证对内存中所有位置的有序访问,即,它的行为就好像它是一个易失性(内存围栏)一样
从:
以原子方式读取和有条件地写入变量,但不会在排序之前创建任何事件,因此对于除weakCompareAndSet
目标之外的任何变量的先前或后续读取和写入不提供任何保证weakCompareAndSet
和所有其他读取和更新操作,如compareAndSet
都具有读取和写入易失性变量的内存效应getAndIncrement
compareAndSet
的行为就像它是一个易失变量一样。但是,weakCompareAndSet
应该只是更改其特定的内存位置。因此,如果该内存位置仅限于单个处理器的缓存,weakCompareAndSet
应该比常规的compareAndSet
快得多
我这样问是因为我已经通过运行不同的线程,将线程数从1变为8,并使totalwork=1e9,对以下方法进行了基准测试(代码是用Scala编写的,Scala是一种静态编译的JVM语言,但在本例中,它的含义和字节码翻译与Java的含义和字节码翻译是同构的-这段简短的代码片段应该很清楚):
val atomic\u cnt=新的原子整数(0)
val atomic_tlocal_cnt=new java.lang.ThreadLocal[AtomicInteger]{
override def initialValue=新的原子整数(0)
}
定义循环原子局部cas={
变量i=0
val-until=totalwork/threadnum
val acnt=原子\u tlocal\u cnt.get
while(我<直到){
i+=1
acnt.比较数据集(i-1,i)
}
acnt.get+i
}
def loop_atomic_weakcas={
变量i=0
val-until=totalwork/threadnum
val acnt=原子碳纳米管
while(我<直到){
i+=1
acnt.weakCompareAndSet(i-1,i)
}
acnt.get+i
}
定义循环原子局部弱卡={
变量i=0
val-until=totalwork/threadnum
val acnt=原子\u tlocal\u cnt.get
while(我<直到){
i+=1
acnt.weakCompareAndSet(i-1,i)
}
acnt.get+i
}
在具有4个双2.8 GHz内核和2.67 GHz 4核i7处理器的AMD上。JVM是Sun Server Hotspot JVM 1.6。结果显示性能没有差异
规格:AMD 8220 4x双核@2.8 GHz
测试名称:循环原子局部cas
- 线程数:1
- 线程数:2
- 线程数:4
- 线程数:8
测试名称:loop_atomic_weakcas
- 线程数:1
- 线程数:2
- 线程数:4
- 线程数:8
测试名称:loop_atomic_tlocal_weakcas
- 线程数:1
- 线程数:2
- 线程数:4
- 线程数:8
- 线程数:1
- 线程数:2
- 线程数:4
测试名称:loop_atomic_weakcas
- 线程数:1
- 线程数:2
- 线程数:4
测试名称:loop_at
return unsafe.compareAndSwapObject(this, valueOffset, expect, update);