首页 > 试题广场 >

int I = 0; I = i ; I = i ;是线

[问答题]
int i = 0;
i = i++;
i = i++;
是线程安全的吗?如果不是,那它在JVM中是如何实现的?JDK中有哪个类可以实现这个目标又是线程安全的?这个类线程安全的原理是什么?
推荐
AtomicInteger,一个提供原子操作的Integer的类。在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。而AtomicInteger则通过一种线程安全的加减操作接口。
编辑于 2015-02-04 19:48:12 回复(0)
是线程安全的,通过 “i = i++;” 断定这段代码是在方法体中,那么i就是一个局部变量,
线程之间根本就不共享,自然不存在线程安全问题
编辑于 2017-07-28 16:36:09 回复(0)
(1) 不是线程安全的。
(2) 实现方式:当我们进行i++工作的时候,分成了几步。1. 通过read指令读取主内存中值,传输到工作内存中。2. 通过load指令把通过read指令传输到工作内存中的值放入到工作内存的变量副本中。3.通过use指令把工作内存中变量副本的值传递给执行引擎。4. 执行 i+1 操作。5. 通过assign指令把 运算后的值传给 赋给工作内存中的变量。6. 通过store指令把工作内存中的变量的值传输给主内存中。7. 通过write指令把通过store传输过来的值写入到主内存的变量中。
(3)AtomicInteger类可以实现这个目标并且是线程安全的。
(4)安全原理:利用了硬件的支持。(不太记得了。)其实主要能把上面的实现流程变成一个原子操作即可。比如说,执行完 i+1 后,马上store(这也是volatile原理)。或者通过synchronized,或者加锁lock来实现。
发表于 2015-07-01 01:06:55 回复(1)
AutomaticInteger
发表于 2015-06-04 23:20:36 回复(1)