学习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.
这就是所谓的并发问题。
参考的资料: 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.
这就是所谓的并发问题。