在Java中,i++ 和 i-- 操作不是线程安全的,因为它们不是原子性操作,可能会导致竞态条件(Race Condition),从而导致线程安全问题。 在JVM 中,i++ 和 i-- 操作通常会被编译成多个字节码指令,在多线程环境下,多个线程可能同时执行这些字节码指令,从而导致竞态条件。例如,一个线程在执行 i++ 操作时,可能被另一...
i是局部变量情况下,i++和i--是线程安全的;全局变量情况下,i++和i--不是线程安全的。原因是:1...
同样,若线程1线执行,最后可能会出现i=1的情况 所以说,当多个线程同时执行i++和i--操作时,是线程不安全的。 那么,应该如何解决出现的以上情况呢? 一个程序运行多个线程本身是没有问题的,问题出在多个线程访问共享资源 多个线程读共享资源其实也没有问题 但是在多个线程对共享资源读写操作时发生指令交错,就会出现...
可见i++是IINC 1 1操作,是直接对内存中的值进行操作,不是线程安全的。 i = i + 1和i++还不一样,分了4步,所以也是线程不安全的。 AtomicInteger 为什么是线程安全的? 我们直接上源码:java.util.concurrent.atomic.AtomicInteger.getAndIncrement 返回值,然后自增 /** * Atomically increments the current v...
绝对不是,绝对不是 原子操作是指 一句汇编指令。但是 i++是指 i 先被使用虽然咱们这里并没有使用,但实际上会被 临时存储下来。然后i=i+1。所以算2句
安全之说,因为别的线程对他造不成影响。 2、如果i是全局变量(类的成员变量),那么是线程不安全的。因为如果是全局变量的话,同一进程中的不同线程都有可能访问到。 如果有大量线程同时执行i++操作,i变量的副本拷贝到每个线程的线程栈,当同时有两个线程栈以上的线程读取线程变量,假如此时是1的话, ...
i++的线程安全性可以总结如下:(1)如果i是局部变量,那么是可重入的,也就是线程安全的。(2)如果i是全局变量,则同一进程的不同线程都可能访问到该变量,因而是线程不安全的。
从上面图中我们可以看到线程1和线程2之间的通信是靠线程1将自己工作内存里的共享变量i的副本刷新到主内存里,线程2再从住内存读取共享变量i来实现的。那么 i++为什么线程不安全,因为他不一个原子操作,如果是原子操作的话,第一个线程i++执行完i=1,第二个线程i++执行完i=2,但是实际上并不是这样的。i+...
结果:不安全,因为i++,++i会在内存中新建个int j = i+1,然后将j赋值给i,当线程在新建了j的时候,cpu进行了切换,这时候i还是等于原来的值,就会导致不安全,以出票举例,卖出了99号票卖出了多张… 解决,方法加synchronized,使用AtomicInteger,也就是使用Atomic包下的类,他的方法是具有原子性的…...