Java-java中递增、递减是否原子操作?如何验证?

Java-java中递增、递减是否原子操作?如何验证?

虐人心 发布于 2017-07-03 字数 47 浏览 1265 回复 5

java中递增、递减是否原子操作?如何验证?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

归属感 2017-10-31 5 楼

这肯定不是原子操作啊!光分析就可以知道啊~i++的结果是当前表达式使用的i当前的值,但是i却自增了1,那么着肯定是有两个步骤的啊!也就是可以这样理解这个过程
i++------ m=i,i=i+1,i=m;如果你一定要进行验证的话也非常简单,两个语句就解决了:

System.out.println(i++);
System.out.println(i);

如果是原子操作的话,后面的语句什么也没有做,那么两个语句的结果应该是相等的,可是却不相等,这充分验证了i++不是原子操作。

夜无邪 2017-10-25 4 楼

都不是原子操作。
写了一个简单程序。如下:

public class Testatomic {
private static int record_number=0;
private static final int SIZE=1000;

private static void outInfo(){
System.out.println(record_number);
}

public static void main(String[] args){

Thread[] threads=new Thread[SIZE];
for(int len=0;len<SIZE;len++){
threads[len]=new AddThread();
threads[len].start();
}
outInfo();
}

static class AddThread extends Thread{
public void run(){
for(int i=0;i<10000;i++){
record_number++;
}
}
}

}

第一次执行:返回结果:8805968
第二次执行:返回结果:9444850

差的很多吧

虐人心 2017-10-22 3 楼

private volatile static int record_number=0;用关键字volatile 确保变量的原子性。

灵芸 2017-08-30 2 楼

递增,递减都确实不是原子操作。原理请参见 《Java Concurrency in Practice》。因为cpu在执行 ++ 或 -- 时,是先拷贝原变量的值,在得到的临时变量上+1(-1),然后拷贝临时变量回原来的值。完成这个至少要三步,所以不是 原子操作。

偏爱自由 2017-08-13 1 楼

JDK 里面有提供 原子操作的基础类, java.util.concurrent.atomic, 如AtomicBoolean, AtomicInteger等。