如果线程1在执行第一条代码的时候,线程2访问i变量,这个时候,i的值还没有变化,还是原来的值,所以是不安全的。 从更底层的角度讲,主要是因为i++这个操作不是原子性的,这个会编译成i= i +1; 所以会出现多线程访问冲突问题。volatile虽然可以保证多线程对修改可见,但代码中用到了 i++, 主要是i++不是原子性...
i是局部变量情况下,i++和i--是线程安全的;全局变量情况下,i++和i--不是线程安全的。原因是:1...
先说结论:在Java中,i++这样的操作并不是线程安全的。多线程环境中使用i++,可能会出现两个问题:...
主要是因为i++这个操作不是原子性的,它会编译成 i = i +1; 其实是做了3个步骤,一个是读取,修改,写入 。所以会出现多线程访问冲突问题。 可以结合Java内存模型来进行说明。
在Java中,i++ 和 i-- 操作不是线程安全的,因为它们不是原子性操作,可能会导致竞态条件(Race Condition),从而导致线程安全问题。 在JVM 中,i++ 和 i-- 操作通常会被编译成多个字节码指令,在多线程环境下,多个线程可能同时执行这些字节码指令,从而导致竞态条件。例如,一个线程在执行 i++ 操作时,可能被另一...
i = i + 1和i++还不一样,分了4步,所以也是线程不安全的。 AtomicInteger 为什么是线程安全的? 我们直接上源码: java.util.concurrent.atomic.AtomicInteger.getAndIncrement 返回值,然后自增 /*** Atomically increments thecurrent value,* with memory effects as specified by {@link VarHandle#getAndAdd}....
i++并不是线程安全的。 i++这个操作实际上包含了三个步骤:读取i的值,对i加1,将新值写回到i。在多线程环境下,这三个步骤可能会被打断,例如,一个线程在读取了i的值并且加1之后,但还没来得及将新值写回i,这时另一个线程也来读取i的值并加1,然后写回i,这时第一个线程再将它计算的值写回i,就会覆盖掉第...
i++的线程安全性可以总结如下:(1)如果i是局部变量,那么是可重入的,也就是线程安全的。(2)如果i是全局变量,则同一进程的不同线程都可能访问到该变量,因而是线程不安全的。
那么 i++为什么线程不安全,因为他不一个原子操作,如果是原子操作的话,第一个线程i++执行完i=1,第二个线程i++执行完i=2,但是实际上并不是这样的。i++这种操作要想保住原子性,只能单个线程串行执行。到这里,很多同学就知道了,因为线程1对共享变量i的更新对线程2不可见!导致的并发线程不安全问题,是...