java笔记六:线程间的协调

java笔记六:线程间的协调

ID:30779987

大小:107.42 KB

页数:8页

时间:2019-01-03

java笔记六:线程间的协调_第1页
java笔记六:线程间的协调_第2页
java笔记六:线程间的协调_第3页
java笔记六:线程间的协调_第4页
java笔记六:线程间的协调_第5页
资源描述:

《java笔记六:线程间的协调》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、java笔记六:线程间的协调咋天重新学习了java多线程的使用,多线程的难点就在线程之间的协调。在《操作系统》一课屮,我们学习了进程,其实多线程和多进程一样,都会涉及到多个进程或者线程对某一资源共享访问的问题,当多个线程都需要修改这个资源的时候就会出现线程安全问题。比如说在银行开个账户会有一个存折和一张卡,如果某一天同一时间丈夫拿着存折去柜台取钱,而妻子拿着银行卡去ATM取钱。当丈夫查询余额里面有3000元,正准备取2000元,这时候妻子也到ATM里面查询也有3000,也取2000元。其实银行不可能让我们这么做,如果这样的话那我们天天取钱去了,还搞什么工作啊。其实在丈夫查询的时候已经对该账

2、号上了锁,另外的银行卡要取钱的话必须等待该锁被释放。下面用一个程序模拟这个例子:1packagecom.sync;22publicclassTestsync2implementsRunnable{3publicBankCardbe=newBankCard();4publicstaticvoidmain(String[]args){5Testsync2test=newTestSync2();6Threadwife=newThread(test);7Threadhusband=newThread(test);8wife.setName("wife");9husband.setName(”hus

3、band”);10wife.start();11husband.start();12}13publicvoidrun(){14bc.getMoney(Thread.currentThread().getName(),2000);15}17}18classBankCard{192021222324252627privatestaticintmoney=3000;//模拟账户余额publicsynchronizedvoidgetMoney(Stringname,intm){〃synchronized(this){try{Thread.sleep(l);}catch(InterruptedExc

4、eptione){e.printStackTrace();if(money>m){28System.out.println(name+"取走了"+m+"元”);29money=money・m;30}else{31System.out.println("对不起,您的余额不足!”32}33//}34}35}上面的例子如果在getMoney()方法上面不加synchronized关键字的话,输出结果为:wife取走了2000元husband取走了2000元而加上synchronized后,输出结果为:wife取走了2000元对不起,您的余额不足!上面两种情况说明,如果多个线程同时访问某个资源,而

5、不给该资源枷锁的话,就会出现问题。而加上synchronized关键字后就可以避免这种错误发生了。它能够保证只有一个线程能够访问getMoney()这个方法,其他药访问该方法的线程必须等待。锁住某个资源可以用synchronized关键字来修饰一个方法或者同步代码块,这样能保证同-时问只能由一个线程访问该资源。①、当两个并发线程访问同一个对象object屮的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。②、然而,当一个线程访问object的一个synchronized(this)同步代

6、码块时,另_个线程仍然可以访问该object中的非synchronized(this)同步代码块。③、尤其关键的是,当一个线程访问object的-个synchronized(this)同步代码块吋,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。我们都知道,操作系统中多个进程Z间如果不进行协调就很容易出现死锁的情况,死锁的四个条件:互斥、占有等待、非剥夺、循环等待。我们只要破坏其中一个条件就能避免死锁发生。线程之间也容易出现死锁,下面这个例子就演示了死锁的情况:packagecom.sync;importcom.thread.SleepTest

7、;publicclassTestDeadLockimplementsRunnable{intflag=1;staticObjectol=newObject();staticObjecto2=newObject();publicvoidrun(){System.out.println(flag);if(flag==1){synchronized(ol){try{Thread.sleep(lOOO);}catch(Inter

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。