并发问题分析

学习java的线程知识过程中,对java并发问题的理解。如有错误,欢迎大家指正!

参考的资料: http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html


其实师兄给我讲过并发问题,但在我的理解中,并发问题是不存在的。因为在我的理解中,我们的操作代码是对同一内存进行操作的(可以理解问根据地址,对相应地址的变量进行操作)。我起初的理解图


[img]http://dl2.iteye.com/upload/attachment/0117/7208/359debf2-366f-36ae-8f61-4c60b37690d6.png[/img]


我的理解是,那些操作代码对数据的操作是直接相应的内存位置进行的。如果出现同一时间,对同一个数据进行操作,那么按照一些硬件的机制(刚学习计算机组成原理),会自动的给这些操作分顺序执行。(我不知道该怎么说明白我一开始的理解了,重点是下面正确的理解)所以按我的理解其实是不会出现并发问题的。

但,在网上翻找资料。通过参考资料里函数执行时内存的运作,终于理解了并发问题出现的原因。

函数执行时:


[img]http://dl2.iteye.com/upload/attachment/0117/7214/ea56a3a4-2cf3-38be-bc07-47bb9b443064.png[/img]

read and load 从主存复制变量到当前工作内存
use and assign 执行代码,改变共享变量值
store and write 用工作内存数据刷新主存相关内容
(以上内容来自参考资料)

由资料我终于了解到,当一个线程执行之前,会将主存的变量复制到新的工作内存中,然后再对新内存的变量进行操作,最后才写回主存中。

那么,因为这样,并发问题就出现了。举个例子
ATM
假设客户A存款的同时有客户B给客户A转账,假如客户A起初的存款有2000,存入500.而客户B给A转账500。那么正常情况下客户A最后的存款就会变成3000.
但是因为并发问题,会出线这种情况:
客户A的线程读取的初始存款为2000,客户B的线程读取的初始存款金额也为2000.那么执行完A、B线程,把数据重新写入内存,内存中客户A的A存款的数据就变成了 2500.

这就是所谓的并发问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值