Java中比较和交换的语义是什么?也就是说,AtomicIntegerjust 的compare和swap方法是否保证在不同线程之间对原子整数实例的特定内存位置进行有序访问,或者它是否保证对内存中所有位置的有序访问,即它就像是一个volatile一样(记忆围栏).
来自文档:
weakCompareAndSet原子地读取并有条件地写入变量但不创建任何发生前的排序,因此不提供关于除了目标之外的任何变量的先前或后续读取和写入的保证weakCompareAndSet.compareAndSet以及所有其他读取和更新操作,例如getAndIncrement读取和写入volatile变量的内存效应.从API文档中compareAndSet可以看出,它就好像是一个易变的变量.但是,weakCompareAndSet应该只是改变其特定的内存位置.因此,如果该存储器位置是单个处理器的高速缓存所独有的,weakCompareAndSet则应该比常规处理器快得多compareAndSet.
我问这个是因为我通过运行threadnum不同的线程来对以下方法进行基准测试,threadnum从1到8 不等,并且totalwork=1e9(代码是用Scala编写的,这是一种静态编译的JVM语言,但它的含义和字节码转换都是同构的在这种情况下Java的代码 - 这个简短的代码片段应该是清楚的):
val atomic_cnt = new AtomicInteger(0)
val atomic_tlocal_cnt = new java.lang.ThreadLocal[AtomicInteger] {
override def initialValue = new AtomicInteger(0)
}
def loop_atomic_tlocal_cas = {
var i = 0
val until = totalwork / threadnum
val acnt = atomic_tlocal_cnt.get
while (i < until) {
i += 1
acnt.compareAndSet(i - …Run Code Online (Sandbox Code Playgroud) Java AtomicInteger类有一个方法 -
boolean weakCompareAndSet(int expect,int update)
Run Code Online (Sandbox Code Playgroud)
它的文件说:
可能是虚假的失败.
这里"虚假失败"的意思是什么?
我一直试图找出最有效的方法,许多线程在位级上改变一个非常大的字节数组.为了便于解释,我将围绕一个多线程的Eratosthenes筛子提出问题,以便于解释这个问题.虽然我不会完全完成代码,因为我将省略某些与之无直接关系的部分.筛子也不会完全优化,因为这不是直接的问题.筛子将以这样的方式工作,即它保存哪个值是字节数组中的素数,其中每个字节包含7个数字(由于所有被签名的东西,我们不能改变第一位).
让我们说我们的目标是找到低于1 000 000 000(10亿)的所有素数.因此,我们需要一个长度为1 000 000 000/7 +1或142 857 143(约1.43亿)的字节数组.
class Prime {
int max = 1000000000;
byte[] b = new byte[(max/7)+1];
Prime() {
for(int i = 0; i < b.length; i++) {
b[i] = (byte)127; //Setting all values to 1 at start
}
findPrimes();
}
/*
* Calling remove will set the bit value associated with the number
* to 0 signaling that isn't an prime
*/
void remove(int i) {
int j = i/7; //gets which array …Run Code Online (Sandbox Code Playgroud)