欢迎来到天天文库
浏览记录
ID:18448868
大小:340.74 KB
页数:17页
时间:2018-09-18
《java se 101 synchronized关键字深入详解》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、JavaSE101synchronized关键字深入详解一、停止一个线程的方式不能使用Thread类的stop方法来终止线程的执行。一般要设定一个变量,在run方法中是一个循环,循环每次检查该变量,如果满足条件则继续执行,否则跳出循环,线程结束。二、不能依靠线程的优先级来决定线程的执行顺序。1、为什么要引入同步机制在多线程环境中,可能会有两个甚至更多的线程试图同时访问一个有限的资源。必须对这种潜在资源冲突进行预防。解决方法:在线程使用一个资源时为其加锁即可。访问资源的第一个线程为其加上锁以后,其他线程便不能再使用那个资源,除非被解锁。银行取钱:
2、两个线程对同一个账户取钱:packagecom.javase.thread;/***该类完成银行取钱功能*两个人同时在一个账户上取钱*@authorx_xiongjie**/publicclassTetchMoney{/***生成两个线程分别去取钱*/publicstaticvoidmain(String[]args){//生成账户Bankbank=newBank();Threadt1=newMoneyThread(bank);//柜台Threadt2=newMoneyThread(bank);//取款机//开始取钱t1.start();t2.
3、start();/***两个线程start之后,分别取出了800元钱*/}}classBank{privateintmoney=1000;/***返回实际取到钱的数目*number表示取的钱*@return*实际取多少钱,取多少钱我就是多少钱,为什么这里还要返回一个int呢?这个值不是和传进来的值一样吗?*这是不一定的,如果有1000块钱,我给柜台小姐说,给我取2000,那这种情况我们就认为是个错误。这时候就不能返回2000了,返回一个*-1,来表示这个错误,因为不知道账户里面有多少钱。*/publicintgetMoney(intnumber
4、){if(number<0){return-1;}elseif(number>money){return-2;}elseif(money<0){return-3;}else{try{//完成取钱之前的准备工作Thread.sleep(1000);}catch(InterruptedExceptione){e.printStackTrace();}money-=number;//第一个线程减掉800剩200,这个时刻,第二个线程把200减了800变成了-600//接下来,第一个线程或者是第二个线程开始打印,谁先打印不清楚,没法预料会出现//什么情
5、况,无论是出现200或者是-600,这都是正常情况,唯一能确定的是最后剩//的钱一定是-600System.out.println("leftmoney:"+money);returnnumber;}}}/***线程类:从柜台取,从取款机取*因为线程要操纵*@authorx_xiongjie**/classMoneyThreadextendsThread{privateBankbank;publicMoneyThread(Bankbank){this.bank=bank;}//从账户里面扣掉取的钱@Overridepublicvoidrun()
6、{System.out.println(bank.getMoney(800));}}两个线程对各自的账户取钱:packagecom.javase.thread;/***该类完成银行取钱功能*两个人同时在一个账户上取钱*@authorx_xiongjie**/publicclassTetchMoney{/***生成两个线程分别去取钱*/publicstaticvoidmain(String[]args){//生成账户Bankbank=newBank();Threadt1=newMoneyThread(bank);//柜台bank=newBank(
7、);//两个账户对各自的账户取钱Threadt2=newMoneyThread(bank);//取款机//开始取钱t1.start();t2.start();/***两个线程start之后,分别取出了800元钱*/}}classBank{privateintmoney=1000;/***返回实际取到钱的数目*number表示取的钱*@return*实际取多少钱,取多少钱我就是多少钱,为什么这里还要返回一个int呢?这个值不是和传进来的值一样吗?*这是不一定的,如果有1000块钱,我给柜台小姐说,给我取2000,那这种情况我们就认为是个错误。这时
8、候就不能返回2000了,返回一个*-1,来表示这个错误,因为不知道账户里面有多少钱。*/publicintgetMoney(intnumber){if
此文档下载收益归作者所有