Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java比较和交换语义与性能_Java_Performance_Concurrency_Jvm_Compare And Swap - Fatal编程技术网

Java比较和交换语义与性能

Java比较和交换语义与性能,java,performance,concurrency,jvm,compare-and-swap,Java,Performance,Concurrency,Jvm,Compare And Swap,Java中比较和交换的语义是什么?也就是说,AtomicInteger的比较和交换方法是否只保证不同线程之间对原子整数实例的特定内存位置的有序访问,还是保证对内存中所有位置的有序访问,即,它的行为就好像它是一个易失性(内存围栏)一样 从: weakCompareAndSet以原子方式读取和有条件地写入变量,但不会在排序之前创建任何事件,因此对于除weakCompareAndSet目标之外的任何变量的先前或后续读取和写入不提供任何保证 compareAndSet和所有其他读取和更新操作,如get

Java中比较和交换的语义是什么?也就是说,
AtomicInteger
的比较和交换方法是否只保证不同线程之间对原子整数实例的特定内存位置的有序访问,还是保证对内存中所有位置的有序访问,即,它的行为就好像它是一个易失性(内存围栏)一样

从:

  • weakCompareAndSet
    以原子方式读取和有条件地写入变量,但不会在排序之前创建任何事件,因此对于除
    weakCompareAndSet
    目标之外的任何变量的先前或后续读取和写入不提供任何保证
  • compareAndSet
    和所有其他读取和更新操作,如
    getAndIncrement
    都具有读取和写入易失性变量的内存效应
从API文档中可以明显看出,
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
运行时间:(显示最后3个) 7504.562 7502.817 7504.626(平均值=7415.637最小值=7147.628最大值=7504.886)

  • 线程数:2
运行时间:(显示最后3个) 3751.553 3752.589 3751.519(平均值=3713.5513最小值=3574.708最大值=3752.949)

  • 线程数:4
运行时间:(显示最后3个) 1890.0551889.8131890.047(平均值=2065.7207最小值=1804.652最大值=3755.852)

  • 线程数:8
运行时间:(显示最后3个) 960.12989.453970.842(平均值=1058.8776最小值=940.492最大值=1893.127)


测试名称:loop_atomic_weakcas
  • 线程数:1
运行时间:(显示最后3个) 7325.425 7057.03 7325.407(平均值=7231.8682最小值=7057.03最大值=7325.45)

  • 线程数:2
运行时间:(显示最后3个) 3663.21 3665.838 3533.406(平均值=3607.2149最小值=3529.177最大值=3665.838)

  • 线程数:4
运行时间:(显示最后3个) 3664.163 1831.979 1835.07(平均值=2014.2086最小值=1797.997最大值=3664.163)

  • 线程数:8
运行时间:(显示最后3个) 940.504 928.467 921.376(平均值=943.665最小值=919.985最大值=997.681)


测试名称:loop_atomic_tlocal_weakcas
  • 线程数:1
运行时间:(显示最后3个) 7502.876 7502.857 7502.933(平均值=7414.8132最小值=7145.869最大值=7502.933)

  • 线程数:2
运行时间:(显示最后3个) 3752.623 3751.53 3752.434(平均值=3710.1782最小值=3574.398最大值=3752.623)

  • 线程数:4
运行时间:(显示最后3个) 1876.723 1881.069 1876.538(平均值=4110.4221最小值=1804.62最大值=12467.351)

  • 线程数:8
运行时间:(显示最后3个) 959.329 1010.53 969.767(平均值=1072.8444最小值=959.329最大值=1880.049)

规格:英特尔i7四核@2.67 GHz 测试名称:循环原子局部cas
  • 线程数:1
运行时间:(显示最后3个) 8138.3175 8130.0044 8130.1535(平均值=8119.2888最小值=8049.6497最大值=8150.1950)

  • 线程数:2
运行时间:(显示最后3个) 4067.7399 4067.5403 4068.3747(平均值=4059.6344最小值=4026.2739最大值=4068.5455)

  • 线程数:4
运行时间:(显示最后3个) 2033.4389 2033.2695 2033.2918(平均值=2030.5825最小值=2017.6880最大值=2035.0352)


测试名称:loop_atomic_weakcas
  • 线程数:1
运行时间:(显示最后3个) 8130.5620 8129.9963 8132.3382(平均值=8114.0052最小值=8042.0742最大值=8132.8542)

  • 线程数:2
运行时间:(显示最后3个) 4066.9559 4067.0414 4067.2080(平均值=4086.0608最小值=4023.6822最大值=4335.1791)

  • 线程数:4
运行时间:(显示最后3个) 2034.6084 2169.8127 2034.5625(平均值=2047.7025最小值=2032.8131最大值=2169.8127)


测试名称:loop_at
return unsafe.compareAndSwapObject(this, valueOffset, expect, update);