- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
java线程基本4
基础篇(四)[wait(),notify()/notityAll()方法]关于这两个方法,有很多的内容需要说明.在下面的说明中可能会有很多地方不能一下子明白,但在看完本节后,即使不能完全明白,你也一定要回过头来记住下面的两句话:[wait(),notify()/notityAll()方法是普通对象的方法(Object超类中实现),而不是线程对象的方法][wait(),notify()/notityAll()方法只能在同步方法中调用][线程的互斥控制]多个线程同时操作某一对象时,一个线程对该对象的操作可能会改变其状态,而该状态会影响另一线程对该对象的真正结果.这个例子我们在太多的文档中可以看到,就象两个操售票员同时售出同一张票一样.线程A 线程B1.线程A在数据库中查询存票,发现票C可以卖出2.线程A接受用户订票请求,准备出票.3. 这时切换到了线程B执行4. 线程B在数据库中查询存票,发现票C可以卖出5. 线程B将票卖了出去6.切换到线程A执行,线程A卖了一张已经卖出的票所以需要一种机制来管理这类问题的发生,当某个线程正在执行一个不可分割的部分时,其它线程不能不能同时执行这一部分.象这种控制某一时刻只能有一个线程执行某个执行单元的机制就叫互斥控制或共享互斥(mutual exclusion)在JAVA中,用synchronized关键字来实现互斥控制(暂时这样认为,JDK1.5已经发展了新的机制)[synchornized关键字]把一个单元声明为synchronized,就可以让在同一时间只有一个线程操作该方法.有人说synchornized就是一把锁,事实上它确实存在锁,但是是谁的锁,锁谁,这是一个非常复杂的问题.每个对象只有一把监视锁(monitor lock),一次只能被一个线程获取.当一个线程获取了这一个锁后,其它线程就只能等待这个线程释放锁才能再获取.那么synchronized关键字到底锁什么?得到了谁的锁?对于同步块,synchronized获取的是参数中的对象锁:synchronized(obj){//...............}线程执行到这里时,首先要获取obj这个实例的锁,如果没有获取到线程只能等待.如果多个线程执行到这里,只能有一个线程获取obj的锁,然后执行{}中的语句,所以,obj对象的作用范围不同,控制程序不同.假如:public void test(){Object o = new Object();synchronized(obj){//...............}}这段程序控制不了任何,多个线程之间执行到Object o = new Object();时会各自产生一个对象然后获取这个对象有监视锁,各自皆大欢喜地执行.而如果是类的属性:class Test{Object o = new Object();public void test(){synchronized(o){//...............}}}所有执行到Test实例的synchronized(o)的线程,只有一个线程可以获取到监视锁.有时我们会这样:public void test(){synchronized(this){//...............}}那么所有执行Test实例的线程只能有一个线程执行.而synchornized(o)和synchronized(this)的范围是不同的,因为执行到Test实例的synchornized(o)的线程等待时,其它线程可以执行Test实例的synchronized(o1)部分,但多个线程同时只有一个可以执行Test实例的synchornized(this).而对于 synchronized(Test.class){//...............}这样的同步块而言,所有调用Test多个实例的线程赐教只能有一个线程可以执行.[synchronized方法]如果一个方法声明为synchronized的,则等同于把在为个方法上调用synchronized(this).如果一个静态方法被声明为synchronized,则等同于把在为个方法上调用synchronized(类.class).现在进入wait方法和notify/notifyAll方法.这两个(或叫三个)方法都是Object对象的方法,而不是线程对象的方法.如同锁一样,它们是在线程中调用某一对象上执行的.class Test{public synchronized void test(){//获取条件,int x 要求大于100;if(x 100)wait();}}这里为了说明方法没有加在try{}catch(){}中,如果没有明确在哪个对象上调用wait()方法,则为this.wait();假如:Test t
您可能关注的文档
最近下载
- 2025年新疆投资发展集团有限责任公司人员招聘笔试备考题库带答案详解(名师推荐).docx
- 在线网课学习课堂《临床伦理与科研道德(山东大学)》单元测试考核答案.docx VIP
- 浅谈直驱风力发电机组偏航异响原因分析及结构优化.pdf VIP
- 商务与经济统计(原书第14版)Ch11.pptx VIP
- 化工厂安全考试题.doc VIP
- 大学生女性健康科普知识讲座幻灯片.ppt
- 《阿Q正传》课件63张.pptx VIP
- 渥太华自伤量表.docx VIP
- 【2025年新版交规题库】2025年版12123学法减分题库(学法减分300题).docx
- 商务与经济统计(原书第14版)Ch16.pptx VIP
文档评论(0)