Chapter_15_Java多线程.ppt

  1. 1、本文档共40页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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

文档评论(0)

血玲珑 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档