面向对象程序设计(Gxw_2Javapart).ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
宝山壁画 宝山壁画是引人注目的昂贵文物。此壁画发现于阿鲁科尔沁旗东沙布乡境内。1994年列为“全国十大考古新发现”之一。宝山壁画中最引人注目的是《杨贵妃教鹦鹉图》。该画高0.7米、宽2.3米,用于笔重彩绘制,最突出的表现了 晚唐风格。唐代擅长绘贵妇仕女的大师周昉绘制了《杨贵妃教鹦鹉图》,不仅享誉中原,而且还影响全国各地。发现于阿旗宝山古墓里的这幅画,就是契丹人聘请中原画家按照周氏风格绘制的, 技法深得周氏画风的真传。在唐人真迹稀如星风的今天,能够从中完整了解唐代人物画的杰出成就,堪称美术史研究的辛事。这幅壁画现今保存在阿鲁科尔沁旗博物馆,历经千年,恍如新绘,是该馆的镇馆之宝。 欢迎大家观看! * 一次运行结果 Producer put:0 Consumer get:0 Consumer get:0 Consumer get:0 Consumer get:0 Producer put:1 Producer put:2 Producer put:3 Consumer get:3 Producer put:4 Producer put:5 Consumer get:5 Producer put:6 Consumer get:6 Producer put:7 Consumer get:7 Consumer get:7 Producer put:8 Consumer get:8 Producer put:9 * 生产者/消费者问题 分析运行结果可发现两个问题 生产者产生的资源可能没有被消费者获取 生产者产生的资源可能被消费者重复取得 造成这些问题的原因是两个线程在访问同一个对象时没有考虑同步的控制。 当消费者尚未取得资源时,生产者可能已经产生新的资源,使消费者错过一些资源 当生产者尚未产生新资源时,消费者再次执行get( )方法,造成资源被重复获取 * 引入同步机制 解决前述问题的关键是引入线程之间的同步控制逻辑 最简单的办法是对CubbyHole加锁 往CubbyHole里写数据时加锁,这时不能读取 从CubbyHole里读数据时加锁,这时不能写 通过synchronized关键字锁定共享对象 方法名前加synchronized关键字标记 用synchronized(Object) {…}标记锁定的代码 当线程执行由synchronized关键字控制的代码时 (临界区),就锁定了共享对象。其他线程如果需要操作该对象,就必须等待该线程执行完受保护的代码。 使用synchronized要注意防止死锁。 使用wait方法使线程进入等待状态。 使用notify、notifyAll唤醒正在等待的线程 * 临界区 public class CubbyHole { private int data; public int get() { return this.data; } public void put(int data) { this.data = data; } } 被并发线程访问相同对象的代码段 称为临界区(Critical Section) CubbyHole的get和put方法是临界区。 为了加锁,可以在这二个方法前加上 synchronized关键字 * 锁定临界区 public class CubbyHole { private int data; public synchronized int get() { return this.data; } public synchronized void put(int data) { this.data = data; } } 当一个线程t通过一个对象k调用一个被同步的方法时,该对象就会被锁住, 线程t获得了对象k的锁。这时,其他线程无法调用这个对象所有被同步的方法。 但可以调用该对象没同步的方法。 因此当Producer调用res.put时,它获得了res的锁。Consumer线程无法调用res.get. 只有等Producer调用res.put结束,锁自动释放后才能取数据。 但是光有同步还不够,在这个例子里, Producer调用res.put结束后,还必须通知 Consumer已经完成了数据写入。 * 新的CubbyHole public class CubbyHole { private int data; private boolean getable = false; public synchronized int get( ) { while (geta

文档评论(0)

文档分享 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档