i是局部变量情况下,i++和i--是线程安全的;全局变量情况下,i++和i--不是线程安全的。原因是:1...
先说结论:在Java中,i++这样的操作并不是线程安全的。多线程环境中使用i++,可能会出现两个问题:...
在Java中,i++ 和 i-- 操作不是线程安全的,因为它们不是原子性操作,可能会导致竞态条件(Race Condition),从而导致线程安全问题。 在JVM 中,i++ 和 i-- 操作通常会被编译成多个字节码指令,在多线程环境下,多个线程可能同时执行这些字节码指令,从而导致竞态条件。例如,一个线程在执行 i++ 操作时,可能被另一...
用synchronized 加锁实现线程安全 很多同学也想到了用 synchronized 加锁实现线程安全,对的加完锁,我们就实现了线程安全。 /*** 用户 100个虚拟线程* 给 i 做一万次 i++* 加上synchronized 锁*/@TestpublicvoidthreadSafeSynchronized()throwsException{i=0;// 用来等待所有线程执行完毕CountDownLatchcountDownLatch...
面试官问这个问题,稍微懂些答题技巧的朋友就知道回答只要是多线程执行是不安全的。那肯定是线程不安全的呀,线程安全你还问什么,手动狗头!关键是要要分析出面试官问这个问题是为了考察你什么知识点,面试官是想知道你对Java内存模型熟不熟悉。Java内存模型 Java的并发采用的是共享内存模型,在共享内存的并发模型里...
先来看下面的示例来验证下 i++ 到底是不是线程安全的。 1000个线程,每个线程对共享变量 count 进行 1000 次 ++ 操作。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
从上面的分析可知,i = i++语句的执行过程有多个操作组成,不是原子操作,因此不是线程安全的。 在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。而java.util.concurrent.AtomicInteger是一个提供原子操作的Integer类,其提供了线程安全且高效的原子操作,是线程安全的。
i++和++i的线程安全分为两种情况: 1、如果i是局部变量(在方法里定义的),那么是线程安全的。因为局部变量是线程私有的,别的线程访问不到,其实也可以说没有线程安不 安全之说,因为别的线程对他造不成影响。 2、如果i是全局变量(类的成员变量),那么是线程不安全的。因为如果是全局变量的话,同一进程中的不同...
如果是方法里定义的,一定是线程安全的,因为每个方法栈是线程私有的。 JVM的栈是线程私有的,所以每个栈帧上定义的局部变量也是线程私有的,意味着是线程安全的。可以参考http://blog.csdn.net/taohuaxinmu123/article/details/24472073中对Java虚拟机栈(Java Virtual Machine Stacks)的说明。
i++的线程安全性可以总结如下:(1)如果i是局部变量,那么是可重入的,也就是线程安全的。(2)如果i是全局变量,则同一进程的不同线程都可能访问到该变量,因而是线程不安全的。