如果线程1在执行第一条代码的时候,线程2访问i变量,这个时候,i的值还没有变化,还是原来的值,所以是不安全的。 从更底层的角度讲,主要是因为i++这个操作不是原子性的,这个会编译成i= i +1; 所以会出现多线程访问冲突问题。volatile虽然可以保证多线程对修改可见,但代码中用到了 i++, 主要是i++不是原子性...
i是局部变量情况下,i++和i--是线程安全的;全局变量情况下,i++和i--不是线程安全的。原因是:1...
主要是因为i++这个操作不是原子性的,它会编译成 i = i +1; 其实是做了3个步骤,一个是读取,修改,写入 。所以会出现多线程访问冲突问题。 可以结合Java内存模型来进行说明。
在Java中,i++ 和 i-- 操作不是线程安全的,因为它们不是原子性操作,可能会导致竞态条件(Race Condition),从而导致线程安全问题。 在JVM 中,i++ 和 i-- 操作通常会被编译成多个字节码指令,在多线程环境下,多个线程可能同时执行这些字节码指令,从而导致竞态条件。例如,一个线程在执行 i++ 操作时,可能被另一...
i++并不是线程安全的。 i++这个操作实际上包含了三个步骤:读取i的值,对i加1,将新值写回到i。在多线程环境下,这三个步骤可能会被打断,例如,一个线程在读取了i的值并且加1之后,但还没来得及将新值写回i,这时另一个线程也来读取i的值并加1,然后写回i,这时第一个线程再将它计算的值写回i,就会覆盖掉第...
i++是不安全的,因为java在操作i++的时候,是分步骤做的,可以理解为:tp = i;tp2 = i+1;i=tp2;如果线程1在执行第一条代码的时候,线程2访问i变量,这个时候,i的值还没有变化,还是原来的值,所以是不安全的。
那么 i++为什么线程不安全,因为他不一个原子操作,如果是原子操作的话,第一个线程i++执行完i=1,第二个线程i++执行完i=2,但是实际上并不是这样的。i++这种操作要想保住原子性,只能单个线程串行执行。到这里,很多同学就知道了,因为线程1对共享变量i的更新对线程2不可见!导致的并发线程不安全问题,是...
由于线程共享栈区,不共享堆区和全局区,所以当且仅当 i 位于栈上是安全的,反之不安全(++i 也同理). 因为如果是全局变量的话,同一进程中的不同线程都有可能访问到。对于读值,+1,写值这三步操作,在这三步任何之间都可能会有 CPU 调度产生,造成 i 的值被修改,造成脏读脏写。 其实,最核心的就是这个 +1...
先说不是原子的,因为这个是分为三步,读值,+1,写值。在这三步任何之间都可能会有CPU调度产生,造成i的值被修改,造成脏读脏写。 接下来说volatile不能解决这个线程安全问题。因为volatile只能保证可见性,不能保证原子性。回答这个只为了让面试官晓得你考虑周全,知识面广。