c中关于自增操作我测试了一小段代码:
int i = 0;
int increment(){
int j = 0;
return ++j;
}
void main(){
++i;
}
~
~
i是全局变量,j是局部变量,反汇编出来的代码如下:
increment:
pushl %ebp
movl $1, %eax
movl %esp, %ebp
popl %ebp
ret
.size increment, .-increment
.p2align 4,,15
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
addl $1, i
popl %ebp
ret
可以看到关于自增运算的指令都是一条指令,加上一点限制:操作数是32位并且没有跨页,这是在C中;
下面看看java中:
public class increment{
public static int i = 0;
public static void main(String ar[]){
increment ic = new increment();
int j = 0;
ic.i++;
j++;
System.out.println(i+" "+j);
}
}
我这里同样设置了类变量和局部变量,下面是javap的部分结果:
7: astore_1
8: iconst_0
9: istore_2
10: aload_1
11: pop
12: getstatic #4; //Field i:I //开始的是对i的运算
15: iconst_1
16: iadd
17: putstatic #4; //Field i:I //i运算结束
20: iinc 2, 1 //j运算
可以看到java中对于局部变量和全局变量关于++操作的不一致,类变量的自增操作不是原子性的,通过getstatic ,iadd,putstatic 得出,是分别进行读,修改,写,而j的运算仅仅是一条iinc指令,局部变量是原子性的。。补充一下,不仅仅是类变量,实例变量(就算是没有声明static),它的自增操作也不是原子性的。
至于为什么java这么设计我想很简单吧,类的静态变量是所有实例进行共享,不是放在某一个方法栈中的,这个变量是这个类型的属性,对这个类变量的更改自然导致了所有实例的“状态”更改,而局部变量在方法返回之后是失去其作用域的。
友情链接:http://madbean.com/2003/mb2003-44/
分享到:
相关推荐
深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发...
分布式Redis原子操作示例,近期项目中遇到分布式项目中多节点大并发操作redis同一个key。此案例利用java调用LUA脚本实现redis操作的原子性。分享出来大家参考。
串口方式:用串口接收中断方式接收,不是DMA. 遇到的问题:串口数据有帧丢失。 原因描述:在串口接收中断中接收到字节时变量size...实际的原因是对size的操作不是原子操作的,具体更改见文档。有相关程序和具体的分析。
redis实现分布式锁,自旋式加锁,lua原子性解锁
14、深入理解井发可见性、有序性、原子性与JMM内存模型 (1).pdf 15、CPU缓存架构详解&高性能内存队列Disruptor 实战 (1).pdf 16、常用并发设计模式精讲 (1).pdf designpattern.zip disruptor.zip forkjoin.zip jmm(1...
可见性可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。这个变量a具有可见性,但是a++ 依然是一个非原子操作,也就这这个操作同样存在线程安
多线程程序中的原子操作
1.认识原子操作 原子操作就是在多线程程序中“最小的且不可并行化的”操作,意味着多个线程访问同一个资源时,有且仅有一个线程能对资源进行操作。通常情况下原子操作可以通过互斥的访问方式来保证,例如Linux下的...
在kotlin中使用原子操作的惯用方法。
对volatile的原子性做探究,加上自己的实验代码和实验结果! Case多核?单核?是否有volatile是否编译器优化-O2结果!
这个代码实现了一个简单的计数器,使用了Java的`AtomicInteger`类来保证多线程环境下的原子性操作。`AtomicInteger`是一个支持原子操作的整数类,它内部使用了CAS(Compare And Swap)算法来实现线程安全的操作。在...
本资源涵盖了Java并发编程的理论基础和实践,主要包括可见性、原子性和有序性的详细介绍,以及多线程的使用原因、好处和坏处等方面的内容。 Java并发编程是一种高效的编程技术,通过多线程实现将计算过程中不必要的...
原子性有序性可见性
C++多线程原子操作实现方法。很很详解!
并发二:原子性、可见性、有序性
long和double类型操作的非原子性探究(csdn)————程序
多线程:可见性、有序性、原子性.xmind
测试了windows下原子操作api的使用,很简单的测试,还是比较有趣的
本研究支持原子核指导原子的电子结构的挑衅性思想。 随着原子序数的增加,化学元素的原子摩尔体积演化服从原子的电子结构规则,与此同时,中子多余的加到原子核上的同时发生了镜面演化。 诸如d嵌段过渡金属的原子...
基于davidmoten用java实现的rtree,对rtree的原子性操作进行性能测试,并结合timeChain论文需求修改split算法.zip