- 1、本文档共40页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
15.5 线程同步(synchronized) 为了处理共享资源竞争,可以使用同步机制。从而确保在任何时刻一个共享对象只被一个线程使用。 线程同步是指两个线程同时操作一个对象时,应该保持对象数据的统一性和整体性。 Java提供两种同步形式,同步方法和同步代码块。 同步方法:使用关键字synchronized修饰的方法 当一个线程A使用一个synchronized修饰的方法时,其他线程想使用这个方法时就必须等待,直到线程A使用完该方法(除非线程A使用wait主动让出CUP资源)。 public class SyncThread extends Thread { private char cha; public SyncThread(char cha) { // 构造函数 this.cha = cha; } public void run() { PrintClass.printch(cha); // 调用同步方法 System.out.println(); } public static void main(String[] args) { SyncThread t1 = new SyncThread(A); // 创建线程A SyncThread t2 = new SyncThread(B); // 创建线程B t1.start(); // 启动线程A t2.start(); // 启动线程B } } class PrintClass { public static synchronized void printch(char cha) { // 同步方法 for (int i = 0; i 5; i++) { try { Thread.sleep(1000);// 打印一个字符休息1秒 } catch (InterruptedException e) { e.printStackTrace(); } System.out.print(cha); } } } AAAAA BBBBB 15.5 同步(synchronized) 同步块 synchronized(someobject) {…} 其中someobject代表当前对象,同步的作用区域是synchronized关键字后大括号以内的部分。 在程序执行到synchronized设定的同步化区块时锁定当前对象,这样就没有其他线程可以执行这个被同步化的区块。 15.5 同步(synchronized) 在多线程程序中,可能出现生产者-消费者问题,即等待同步数据的问题。 生产者做面包,消费者吃面包 面包没做出来,消费者能吃到面包吗? 面包已经做出来,消费者没吃,生产者还需要再做面包吗? 面包没做出来,消费者想吃面包,怎么办? 面包已经做出来,消费者没吃,生产者想做下一个面包,怎么办? 15.5 同步(synchronized) 面包没做出来,消费者想吃面包,怎么办?---消费者等待(等待生产者把面包做出来) 面包已经做出来,消费者没吃,生产者想做下一个面包,怎么办? ---生产者等待(等待消费者把面包吃掉) 生产者 消费者 . 共享对象 write read 分析: 生产和消费对应两个线程,面包是共享资源,可用一个变量表示。 15.5.1 wait-notify 机制 当synchronized方法中的wait()方法被调用时,当前线程将被中断运行,并且放弃该对象的锁。 一旦线程调用了wait ()方法,它便进入该对象的等待列表。要从等待列表中删除该线程,使它有机会继续运行,其它线程须调用同一个对象上的notify ()或者notifyAll ()方法。 当线程再次成为可运行的线程后,它便试图重新进入该对象。一旦可以使用该对象锁时,其中的一个线程将锁定该对象,并且从它上次调用wait()方法后的位置开始继续运行。 public class Water { boolean water = false;// 反应水塘状态的变量 public boolean isEmpty() {// 判断水塘是否无水的方法 return water ? false : true; } public void setWater(boolean haveWater) { // 更改水塘状态的方法 this
您可能关注的文档
- 《JAVA课程实训设计指导书含答案》.doc
- 3、电子政务应用支撑技术.ppt
- 21天学通JAVA(高清版).pdf
- 23种JAVA设计模式和15种J2EE设计模式.pdf
- Java__数据结构_图.doc
- JAVA_3初始化和清除.ppt
- JAVA_4隐藏实施过程.ppt
- Java_Servlet入门教程.pdf
- JAVA_WEB_第一天.doc
- 农民务工培训.ppt
- 七章货物的保险.pptx
- 三章国际间接投资.pptx
- 人性假设理论.pptx
- 外研高一英语必修三ModuleIntroduction汇总市公开课获奖课件省名师示范课获奖课件.pptx
- 月相成因优质获奖课件.pptx
- 小学二年级语文课件《狐假虎威》省名师优质课赛课获奖课件市赛课一等奖课件.pptx
- 养羊业概况专题知识讲座.pptx
- 微生物的实验室培养市公开课获奖课件省名师示范课获奖课件.pptx
- 人教版六年级下册式与方程整理与复习市公开课获奖课件省名师示范课获奖课件.pptx
- 必威体育精装版高中精品语文教学:第二单元-第7课-诗三首:涉江采芙蓉、-短歌行、归园田居市公开课获奖课件省名师.pptx
文档评论(0)