>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 23830 个阅读者 刷新本主题
 * 贴子主题:  [讨论]书中多线程章节的语言表述有误? 回复文章 点赞(0)  收藏  
作者:雪后初晴    发表时间:2020-06-07 18:27:47     消息  查看  搜索  好友  邮件  复制  引用


《Java面向对象编程》,p420页,表13-3下面的那段话,原文为:
由此可见,对于生产者线程而言,getPoint和push方法必须为一个原子操作。
当producer1线程执行这个原子操作时,其他线程不允许修改Stack对象的point属性

我认为应修改为:
当producer2线程执行这个原子操作时,其他线程不允许访问Stack对象的point属性

我的思考如下:producer2线程没有将point++前,producer1不允许getPoint获取(访问)point。
这样就不会出现2个goods7。



程序猿的技术大观园:www.javathinker.net

[这个贴子最后由 雪后初晴 在 2020-06-07 20:46:21 重新编辑]
  Java面向对象编程-->输入与输出(上)
  JavaWeb开发-->JSP技术详解(Ⅰ)
  JSP与Hibernate开发-->第一个helloapp应用
  Java网络编程-->基于UDP的数据报和套接字
  精通Spring-->Vue CLI脚手架工具
  Vue3开发-->Vue简介
  为网站代码块pre标签增加一个复制代码按钮代码
  详细介绍float和double类型的区别
  Java Optional 解决空指针异常总结
  64匹马,8个赛道,找出跑得最快的4匹马
  超详细的Java运算符修炼手册(优秀程序员不得不知道的运算技...
  Java读取大文件的高效率实现_java大文件
  Java设计模式:观察者模式
  Java设计模式:享元模式
  Java Scoket之java.io.EOFException解决方案
  Java入门实用代码:获取远程文件大小
  Java入门实用代码:获取本机IP地址及主机名
  Java 入门实用代码:从 List列表中 截取子列表
  Java入门实用代码:获取数组长度
  JAVA日期加减运算
  中国有多少程序员?现在还值得学java吗?
  更多...
 IPIP: 已设置保密
楼主      
该用户目前不在线 雪后初晴 
  
威望: 0
级别: 新手上路
魅力: 142
经验: 142
现金: 1068
发文章数: 8
注册时间: 0001-01-01
 消息  查看  搜索  好友  邮件  复制  引用


原文中表格如下:
时间序列    |    point    |    producer2线程    |    producer1线程

1                6            获得同步锁,执行
                            getPoint()方法,返回
                            6,释放同步锁... ...

2                6                                    获得同步锁,执行
                                                      getPoint()方法,返回
                                                      6,释放同步锁... ...

...                    ...                    ...                    ...



既然producer2线程先执行了getPoint(),那么在它后续push操作没有返回时,producer1
线程就不应该被允许调用getPoint(),从而导致2个goods7 的问题。

也就是producer2在执行原子操作时,producer1不能访问Stack中的point属性。
请问老师我的理解是正确的吗?
发文章时间 2020-06-07 20:52:58
 IPIP: 已设置保密 1 楼     
该用户目前不在线 sunweiqin 
  

威望: 0
级别: 高级天王 [荣誉]
魅力: 480
经验: 480
现金: 1128
发文章数: 171
注册时间: 2016-09-12
 消息  查看  搜索  好友  邮件  复制  引用


你的理解是正确的。换成这样的表述最准确:

当producer1线程或producer2线程执行这个原子操作时,其他线程不允许访问Stack对象的point属性。

你觉得呢
发文章时间 2020-06-08 08:27:40
 IPIP: 已设置保密 2 楼     
该用户目前不在线 雪后初晴 
  
威望: 0
级别: 新手上路
魅力: 142
经验: 142
现金: 1068
发文章数: 8
注册时间: 0001-01-01
 消息  查看  搜索  好友  邮件  复制  引用



老师说的很准确,结合到本例子,我在您的基础上再完善一下:

当producer1线程或producer2线程执行这个原子操作时,其他线程不允许访问Stack对象的point属性。

在本例子给出的表13-3中,因为producer2先获得同步锁(对应时间序列为1),根据线程同步原则,
producer1 必须等待 producer2 执行完一些列原子操作后,才能执行另外的原子操作.所以表中producer2
列下时间序列为3的操作应提升为时间序列2,而表中producer1下时间序列为2的操作,应下降为时间序列3。
发文章时间 2020-06-10 21:35:10
 IPIP: 已设置保密 3 楼     
该用户目前不在线 雪后初晴 
  
威望: 0
级别: 新手上路
魅力: 142
经验: 142
现金: 1068
发文章数: 8
注册时间: 0001-01-01
 消息  查看  搜索  好友  邮件  复制  引用


老师请问怎么突然不能修改自己发的帖子了,有些语言后期可能要润色下,表述更准确。
发文章时间 2020-06-10 21:37:12
 IPIP: 已设置保密 4 楼     
1页 4条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。