一个多线程的奇怪问题!非常奇怪!绝对奇怪!
关于共享资源的一个问题,
比如说两个线程(线程1,线程2)都给张三加工资。
张三的原来工资是double salary=1000,线程1给他加double a=100,线程2给他加double b=200
首先线程1开始执行,分为三个步骤:
A.将salary存入某个寄存器(比方说是AX)
B.将增加的工资加入AX
C.把AX里的数值再赋给salary
此时奇怪的事发生了。
假如线程2的优先级比线程1要高
恰巧线程1执行完A.B就中断了,
线程2开始执行了,
那么线程2就执行ABC三个步骤。结果现在salary是1200了。线程2功成身退了。
线程1接着执行步骤C,那么AX里的值再赋给salary,还是1200啊。
我认为是线程2的步骤A覆盖了线呈1的AB步骤,而线程2的C步骤又取代了线程1的C步骤(就是说线程1的C步骤本来是把1100赋给salary的,可是实际上是1200赋给了salary)
本来张三可以是1300的,实际却是1200。
再来看看书上对这个问题的解释:
“线程1的步骤C覆盖了线程2对张三工资的修改”
按书上的解释,我觉得是说线程2所做的事情都被覆盖了,salary是1100。
我很迷惑,到底是书对还是我对。
到底是1100还是1200?
谢谢大家!
问题点数:100、回复次数:5Top
1 楼hxzg001(丢掉幻想,准备辞职)回复于 2005-01-15 08:57:21 得分 60
没有具体代码吗?我觉得首先应该确定这个问题中的共享资源是什么,是张三的工资还是寄存器,如果只有张三的工资是共享资源,那书上是对的,如果寄存器也是共享资源,则你是对的。Top
2 楼redex(cc)回复于 2005-01-15 13:27:04 得分 20
“我认为是线程2的步骤A覆盖了线呈1的AB步骤,而线程2的C步骤又取代了线程1的C步骤
(就是说线程1的C步骤本来是把1100赋给salary的,可是实际上是1200赋给了salary)”
对呀,线程2的步骤A损坏了线程1运行完AB步骤后的结果,等于把线程1所做的事破坏了.Top
3 楼redex(cc)回复于 2005-01-15 13:28:01 得分 0
什么书,书名贴出来大家看看.Top
4 楼sshcx(大错特错)回复于 2005-01-15 13:31:14 得分 0
JAVA核心技术2第4版
1.7.2节 同步访问共享资源
张三的工资是共享资源。
二楼说的,我不明白,我觉得我是对的,Top
5 楼redex(cc)回复于 2005-01-15 13:54:35 得分 20
Now, suppose the first thread executes Steps 1 and 2, and then it is
interrupted. Suppose the second thread awakens and updates the same
entry in the account array. Then, the first thread awakens and completes
its Step 3.
That action wipes out the modification of the other thread. As a result, the
total is no longer correct.
兄弟看的是中文版吧?建议你看英文版吧,呵呵.Top




