CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 扩展类

一个多线程的奇怪问题!非常奇怪!绝对奇怪!

楼主sshcx(大错特错)2005-01-15 01:53:09 在 Java / J2SE / 扩展类 提问

关于共享资源的一个问题,  
  比如说两个线程(线程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

相关问题

  • 多线程的奇怪问题
  • 一个关于VC多线程的奇怪问题
  • 奇怪!请教高手,多线程与ADO访问数据库的问题。
  • 奇怪的问题:MFC,多线程,Socket,变量存取的问题?
  • 100分求解一个奇怪的多线程和Exception的问题
  • 多线程啊多线程
  • 一个Dialog里面的多线程问题,奇怪奇怪!高手解释一下!!!
  • 多线程socket!!!
  • 多线程
  • 多线程

关键词

  • 线程
  • 执行
  • 步骤
  • 奇怪
  • salary
  • 工资
  • 寄存器
  • 共享资源
  • 覆盖
  • 书

得分解答快速导航

  • 帖主:sshcx
  • hxzg001
  • redex
  • redex

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo