搜索
写经验 领红包

为什么map线程不安全(为什么simpledatefomat线程不安全)

导语:面试题:number++为什么线程不安全

回答这个问题我们一定要提到线程的原子性:既一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。原子性就像数据库里面的事务一样。

通过对线程的原子性分析,我们可能会怀疑既然number++不是线程安全的,那么是不是number++需要多行指令来完成操作的呢? 只有多行指令来完成number++才会出现线程安全的问题,所以我们对number++这行代码进行反汇编。

java代码:

反汇编结果:

果然通过反汇编结果我们可以发现其实number++其实是由四行字节码指令执行的。

1、getstatic:先获取number的值

2、iconst_1:准备一个int类型的值 1

3、iadd:将number的值和int类型的值 1进行相加操作

4、putstatic:将相加的结果赋值给number变量

知道number++需要四行字节指令执行,我们就可以分析出出现线程安全的具体情况了,假如现在有两个线程t1和t2,t1线程先执行,t1线程执行了指令1,2,3这时候cpu时间片用完了,++后的值1 还没有赋值给变量number,但是cpu的执行权被t2线程抢到了,t2线程将4个字节指令都执行完了,这个时候的number=1,然后t1线程获得cpu时间片继续执行接下来的指令将值1赋值给number,所以number的最终值是1

相信这样的分析,你看了一定懂了吧[呲牙][呲牙]

本文内容由小滢整理编辑!