并发问题分析

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

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


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





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

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

函数执行时:




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.

这就是所谓的并发问题。

猜你喜欢

转载自903180552.iteye.com/blog/2301442