java 基本类型 线程安全_【Java基础】线程安全问题及产生的原因是什么? - 收获啦...

最近工作中遇到不少多线程问题,但自己一直对多线程的理解比较表层。没有深入探究。正是最近工作中遇到的问题,致使我深入的去了解多线程安全问题为什么会产生。

多线程使我们的计算机可以同时运行多个程序,感觉很美好。

but,多线程的安全问题,到底怎么回事,到底怎么来的,对于有点理想主义的我来说这简直就是BUG。

网上有不少介绍多线程产生的原因的。我大致看了一遍,感觉都介绍的太粗线条,可能不太适合经验不足者理解。

so,我就自己整理一下我自己的理解。如有谬误欢迎大家指正和交流。

首先java 虚拟机中 内存区域分为线程共享和线程私有的两大类。

f1652a933e726046acaebfc5f8871d31.png

现场 画图哈哈。

java虚拟机在执行字节码指令的时候是什么情况呢?

假设int 类型数据a在线程共享区域目前值为0,java执行以下代码时,需要经过哪些操作呢?public class Test001{ public  int a = 0; public void dosomething(){ a ++ ; }}

我写了一个java类,编译一下

f100f5d2aa442210ed009dcb4b0c3761.png

执行命令javap -l -v Test001.class

我得到了如下结果

69f638890046711ff16330e231d323dc.png

这个是主要执行自增的字节码指令,我们来看下执行过程;

0:将对象本身入栈,这里隐含第一个参数为this;

1:复制栈顶元素,也就是对象的引用;

2:获取栈顶对象属性a的值,并将其入栈;

5:将int型1推送至栈顶;

6:将栈顶两个int类型数据相加,并将结果入栈;

7:将栈顶的值放入对象属性a中;

10:return,不用解释了

我们可以看到简单的一个自增操作,虚拟机要执行的指令却不止一个。

在这一组指令执行过程中,cpu是有可能切换线程的,如果在当前线程t1被挂起之后其他线程修改了这个对象的a属性值,那么恢复线程执行时t1线程将会覆盖其他线程已经修改过的值。

所以,,线程安全问题就是这么产生的了。

理解了怎么产生的就更容易解决如何避免线程安全问题了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值