10郝斌(75-81)线程同步、买票、生产消费程序.docVIP

10郝斌(75-81)线程同步、买票、生产消费程序.doc

  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文档。上传文档
查看更多
10郝斌(75-81)线程同步、买票、生产消费程序

第75课:线程同步问题的产生原因 买票程序伪算法: if (票数大于零); { 买一张票; 票数减1; } 如果ABC三个线程去卖票,某一时刻CPU可以任意切换如果线程去切换可能一张票同时卖给几个人。这如何避免? 是因为上面的代码是分隔的CPU才可以去切换,如果是一个整体就切换不了。数据库里有一个事物就是所有操作都成功最终结果才是成功的,如果通过一种机制A执行上面代码的时候,BC不可以执行,除非A执行完BC才可以任意执行。只是最关键的两步同步:票数大于零 和票数减这两步只能有一个线程执行时,其它不能执行。一个线程里最核心的步骤只有一个线程去访问,计算机特别快让其它人感觉不到。 举例:一个站点卖10张票 class A implements Runnable{ public static int tickets = 10;//假设10张票 public void run() //ren能不能访问属性tickets,能。 重写类库里的run()方法 { while (true){ if (tickets 0){ System.out.printf(%s线程正在卖出第%d张票\n, Thread.currentThread().getName(), tickets);//返回线程一个引用或叫句柄,取它的名字 --tickets; } else{ break; } } } } public class TestTickets{ public static void main(String[] args){ A aa1 = new A(); Thread t1 = new Thread(aa1);//不能写aa1.start(),因为aa1里就没有run()方法 t1.start(); } } 例2出现同时卖第10张票,说明很多代码对同一代码进行访问才有顺序和互斥,所以关键步骤必须保持互斥。 结论:如果存在ABCDE五个站点卖票只要保证在同一时刻只有一个站点在执行if()if (票数大于零);{买一张票;票数减1;}这个程序就不会出现卖同一张票。要保证卖同一数据库中的票,需要在定义票的属性前加static静态的。 第76节课复习:例2的程序逻辑上有问题,new Thread(aa1)和new Thread(aa2)感觉不是在买同一数量的票。 第77节课:正确卖票程序 第二种方式创建线程 class A implements Runnable{ public int tickets = 10;//上节课我们在int前加static但这样不是很合适 String str = new String(); //str名字是任意的。但必须得有这行,因为synchronized (str)必须调用类对象名。 public void run() { while (true) { synchronized (str)//利用语法规则保证一个线程执行另一个线程就不能执行,所以加上这句synchronized (str),此句的含义是if..else关键代码只能是一个线程使用,synchroni须()是库函数实现并规定str必须是类对象名。 {//当站点A执行synchronized()语句时,即锁定了str,如果CPU切换到了B站点,那么B站点就要判断是否锁定str对象,synchronized (str)里面有个锁定器,当A执行了这行后就霸占了if.else代码,即使切换到别的站点也因为需要先执行synchronized (str)代码,而这行语句的意思是如果A站点执行已经执行就代表霸占住str这个对象,就能执行if else语句。而B站点由于CPU切换到 B了,但因为没能霸占住str就不能执行if..else语句,而str只能被一个线程霸占,所以导致只有A站点执行完后其它站点才能执行。 if (tickets 0) { System.out.printf(%s线程正在卖出第%d张票\n, Thread.currentThread().getName(), tickets); --tickets; } else { break; } }//执行到这行时,霸占结束也就是synchronized (str)作用效果结束,在由下个站点或CPU切换到任意站点来执行。 }//以上代码说明只允许一个线程执行,cpu可以来回切换,但因为有synchronized (str)语句造

文档评论(0)

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

教师资格证持证人

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

领域认证 该用户于2024年04月12日上传了教师资格证

1亿VIP精品文档

相关文档