《Java开发实战经典》教师讲解030904 同步与死锁.pptVIP

《Java开发实战经典》教师讲解030904 同步与死锁.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
JAVA 应用开发详解 第9章:多线程 —— 同步与死锁 本章目标 了解线程同步的作用 了解同步代码块及同步方法的作用 了解死锁的产生 同步与死锁 一个多线程的程序,如果是通过Runnable接口实现的,则意味着类中的属性将被多个线程共享,那么这样一来就会造成一种问题,如果这多个线程要操作同一资源的时候就有可能出现资源的同步问题。例如:以之前的卖票程序来讲,如果多个线程同时操作的时候就有可能出现卖出票为负数的问题。 问题的引出 程序的问题 从运行结果可以发现,程序中加入了延迟操作,所以在运行的最后出现了负数的情况,那么为什么现在会产生这样的问题呢? 从上面的操作代码可以发现对于票数的操作步骤如下: 1、 判断票数是否大于0,大于0则表示还有票可以卖 2、 如果票数大于0,则卖票出去 但是,在上面的操作代码中,在第1步和第2步之间加入了延迟操作,那么一个线程就有可能在还没有对票数进行减操作之前,其他线程就已经将票数减少了,这样一来就会出现票数为负的情况 问题的解决 如果想解决这样的问题,就必须使用同步,所谓的同步就是指多个操作在同一个时间段内只能有一个线程进行,其他线程要等待此线程完成之后才可以继续执行。 问题的解决 解决资源共享的同步操作,可以使用同步代码块和同步方法两种方式完成。 同步代码块 在代码块上加上“synchronized”关键字的话,则此代码块就称为同步代码块。 同步代码块格式: synchronized(同步对象){ 需要同步的代码 ; } 使用同步代码块解决以上的同步问题 同步方法 除了可以将需要的代码设置成同步代码块之外,也可以使用synchronized关键字将一个方法声明成同步方法。 同步方法定义格式: synchronized 方法返回值 方法名称(参数列表){} 使用同步方法解决以上问题 方法定义的完整格式 学习完了synchronized关键字之后,下面就可以给出Java中方法定义的完整格式了: 访问权限{public|default|protected|private} [final] [static] [synchronized] 返回值类型|void 方法名称(参数类型 参数名称,…..) [throws Exception1,Exception2]{ [return [返回值|返回调用处]] ; } 死锁 同步可以保证资源共享操作的正确性,但是过多同步也会产生问题。例如:现在有张三想要李四的画,李死想要张三的书,那么张三对李四说了:“把你的画给我,我就给你书”,李四也对张三说了:“把你的书给我,我就给你画”,此时,张三在等着李四的答复,而李四也在等着张三的答复,那么这样下去最终结果可想而知,张三得不到李四的画,李四也得不到张三的书,这实际上就是死锁的概念。 定义两个类 测试死锁 下一章内容 E-MAIL:mldnqa@163.com ? MLDN 软件教学研发部 MLDN 软件教学研发部 class MyThread implements Runnable{ // 实现Runnable接口 private int ticket = 5 ; // 一共5张票 public void run(){ // 覆写run()方法 for(int i=0;i100;i++){ // 超出票数的循环 if(ticket0){ // 判断是否有剩余票 try { Thread.sleep(300) ; // 加入延迟 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(卖票:ticket = + ticket--) ; } } } }; public class SyncDemo01 { public static void main(String[] args) { MyThread mt = new MyThread() ; // 定义线程对象 Thread t1 = new Thread(mt) ; // 定义Thread对象 Thread t2 = new Thread(mt) ; // 定义Thread对象 Thread t3 = new Thread(mt) ; // 定义Thread对象 t1.start() ; // 启动线程 t2.start() ; // 启动线程 t3.start() ; // 启动线程 }} class MyThread implements R

您可能关注的文档

文档评论(0)

1243595614 + 关注
实名认证
文档贡献者

文档有任何问题,请私信留言,会第一时间解决。

版权声明书
用户编号:7043023136000000

1亿VIP精品文档

相关文档