>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 24686 个阅读者 刷新本主题
 * 贴子主题:  《Java面向对象编程》第二版P448源代码有一个BUG 回复文章 点赞(0)  收藏  
作者:apolo    发表时间:2019-07-01 22:20:42     消息  查看  搜索  好友  邮件  复制  引用

在P448页讲解Condition条件接口中,书上给了一个例子为SyncTest.java.
定义了三个类:
Stack类:getPoint()、pop()和push()均利用外部锁进行了同步
Producter类:在run()方法中利用外部锁对Stack对象进行了同步
Consumer类:在run()方法中并没有对Stack对象进行同步,其具体实现为:
public void run(){
    String goods;
    for(int i = 0; i < 200; ++i){
        goods = theStack.pop();  //此处pop利用外部锁实现了同步,不会有问题
        System.out.println(getName()+".pop"+goods+"from"+theStack.getName());    //BUG出现在这一句
        yield();
    }
}
由于输出数据并不在同步代码块中,因此导致整个程序的输出结果为:
点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小
注意,这里程序的执行逻辑并没错,但是输出却出现了错误,因为在执行语句
goods = theStack.pop()将good9取出后,producter2获得了CPU的执行权,执行了push方法,放入了good9,并输出了
producter2 push 9
而后consumer1执行了输出语句:
consumer1 pop 9 (System.out.println(getName()+".pop"+goods+"from"+theStack.getName());)
以上原因造成了逻辑正确,而输出错误,因此应该把pop的输出数据放入pop中,这样不会出现这个输出错误了。



程序猿的技术大观园:www.javathinker.net
  Java面向对象编程-->Swing组件(下)
  JavaWeb开发-->JSP技术详解(Ⅱ)
  JSP与Hibernate开发-->持久化层的映射类型
  Java网络编程-->用Axis发布Web服务
  精通Spring-->通过Vuex进行状态管理
  Vue3开发-->组合(Composition)API
  java实现动态编译并动态加载
  TCP、UDP及Socket代码示例
  NIO底层原理
  Java内存设置详解(含内存溢出问题的解决)
  Java中保留数字的若干位小数位数的方法
  使用策略模式优化代码实践,如何让项目快速起飞
  JDK14的新特性
  Java设计模式中的工厂模式和策略模式范例
  Java设计模式:组合模式
  Java入门实用代码:遍历目录
  Java入门实用代码:向文件写入字符串
  Java入门实用代码:打印平行四边形
  Java 入门实用代码:取最大和最小值
  Java入门实用代码:获取数组长度
  【Java 并发笔记】CountDownLatch 相关整理
  更多...
 IPIP: 已设置保密
树形列表:   
图片的内容为:...producter1 push ... apolo 2019-07-01 22:21:40
To apolo,非常赞叹你认真专研的学习态度。你的... sunweiqin 2019-07-02 12:11:09
1页 2条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


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