从上面的分析可知,i = i++语句的执行过程有多个操作组成,不是原子操作,因此不是线程安全的。 在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。而java.util.concurrent.AtomicInteger是一个提供原子操作的Integer类,其提供了线程安全且高效的原子操作,是线程安全的。
由于线程共享栈区,不共享堆区和全局区,所以当且仅当 i 位于栈上是安全的,反之不安全(++i 也同理). 因为如果是全局变量的话,同一进程中的不同线程都有可能访问到。对于读值,+1,写值这三步操作,在这三步任何之间都可能会有 CPU 调度产生,造成 i 的值被修改,造成脏读脏写。 其实,最核心的就是这个 +1...
既然结果不能保证一致性,肯定是线程不安全的。这是一条Java语句,那我就从Java内存模型上来解释吧。 如果一开始i等于0,那么java内存模型如图: i得到最大值200很容易理解 线程A首先对i变量进行100次++操作,JMM如下 线程B再对i变量进行100次++操作,JMM如下 i得到最大值很容易理解,那么什么情况i是得到最小值2呢?
学习java多线程的时候,经常碰到以 i++为例的说明多线程是不安全的,说i++分三步操作完成的,如果执行到中间步骤,其余的线程也同时操作了该变量,就会出现线程不安全的问题;但是要理解这个问题,其实是需要一些计算机方面的理论作为铺垫的,否则无法真正理解这个解释;下面我们来说明下,这些前置知识; 工作内存和主内存? ...
c1.countDown(); }try{ c1.await(); Thread.sleep(1000); System.out.println("===UnsafeCounter:"+UnsafeCounter.get()); }catch(InterruptedException e) { e.printStackTrace(); }//使用线程安全的原子类SafeCounter safeCounter=newSafeCounter(); CountDown...
因为iinc指令,对应的hotspot源码,至少要做这么多事情。hotspot这里的代码是不会加锁的,所以这个操作不是线程安全的。 这个代码是不是大家一看就看懂了。这段代码是截取自我手写的JVM项目。这就是手写JVM对于每个人的意义:你自己写,你就得站在设计者的角度去思考,你就会不自觉的把问题越想越细致。而且,你手上有一...
在java语言中,大部分的线程安全类都属于相对线程安全的,例如Vector、HashTable、Collections的synchronizedCollection()方法保证的集合。 4、线程兼容 线程兼容就是我们通常意义上所讲的一个类不是线程安全的。 线程兼容是指对象本身并不是线程安全的,但是可以通过在调用端正确地使用同步手段来保证对象在并发环境下可以安全...
Hashmap 是线程不安全的,HashMap 底层是一个 Entry 数组,当发生 hash 冲突的时候,hashmap 是采用链表的方式来解决的 1 1 分享 1 张老师 展开 不是线程安全的;如果有两个线程A和B,都进行插入数据,刚好这两条不同的数据经过哈希计算后得到的哈希码是一样的,且该位置还没有其他的数据。所以这两个线程都...
我接触到的并发缺陷绝大部分是因为线程安全问题导致的,还有一些数据库锁的问题(这个不擅长)这里就不分享了。
答案:同步集合与并发集合都为多线程和并发提供了合适的线程安全的集合,不过并发集合的可扩展性更高。 在Java1.5之前... 问答题 【简答题】什么是Java Timer类?如何创建一个有特定时间间隔的任务? 答案:java.util.Timer是一个工具类,可以用于安排一个线程在未来的某个特定时间执行。Timer类可以用安排一次性任......