资源描述:
《例银行帐户的存取款线程设计(线程同步)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、例银行帐户的存取款线程设计。本例设计三个类,银行帐户类Account1、存款线程类Save1和取款线程类Fetch1。程序如下:一、未考虑同步问题(未锁定)classAccount1//帐户缓冲区{privateStringname;privateintvalue;voidput(inti)//欲存入金额i{value=value+i;//存入时,value值增加}intget(inti)//欲取金额i,返回实际取到金额{if(value>i)value=value-i;//取走时,value值减少e
2、lse//帐户金额不够所取时{i=value;value=0;//取走全部所余金额}returni;}inthowmatch()//查看帐户上现有金额{returnvalue;}}classSave1extendsThread//存款线程{privateAccount1a1;privateintamount;publicSave1(Account1a1,intamount){this.a1=a1;this.amount=amount;}publicvoidrun(){intk=a1.howmatch(
3、);try{sleep(1);//花费时间}catch(InterruptedExceptione){System.out.println(e);}a1.put(amount);System.out.println("现有"+k+",存入"+amount+",余额"+a1.howmatch());}classFetch1extendsThread//取款线程{privateAccount1a1;privateintamount;publicFetch1(Account1a1,intamount){th
4、is.a1=a1;this.amount=amount;}publicvoidrun(){intk=a1.howmatch();try{sleep(1);//花费时间}catch(InterruptedExceptione){System.out.println(e);}System.out.println("现有"+k+",取走"+a1.get(amount)+",余额"+a1.howmatch());}}publicstaticvoidmain(Stringargs[]){Account1a1=n
5、ewAccount1();(newSave1(a1,100)).start();(newSave1(a1,200)).start();(newFetch1(a1,500)).start();}}程序运行结果:现有0,存入100,余额100现有0,存入200,余额300现有0,取走300,余额01)SynchronizedSynchronized锁定一段代码,称为创建一个代码临界区,使得线程必须等候特定资源的所有权。当第一个线程执行这段代码时,它获取特定的对象的所有权,即拥有该对象的锁。此时,如果有第二
6、个线程对同一个对象也要执行这段代码时,它试图获取该对象的所有权,但因该对象已被锁定,则第二个线程必须等待,直到锁被释放为止。第一个线程执行完<语句>后,自动释放了锁,接下去第二个线程获得锁并可运行。这样就形成了多个线程对同一个对象的“互斥”使用方式,该对象称为“同步对象”。这种锁定方式是针对某个特定对象而言的。如果有两个线程同时对两个不同的对象进行操作,则没有锁定,它们可以同时进入代码的临界区二、带锁定的存取款线程设计。classSave2extendsThread//存款线程{privateAcco
7、unt1a1;privateintamount;publicSave2(Account1a1,intamount){this.a1=a1;this.amount=amount;}publicvoidrun(){synchronized(a1)//锁定帐户对象{intk=a1.howmatch();try{sleep(1);//花费时间}catch(InterruptedExceptione){System.out.println(e);}a1.put(amount);System.out.printl
8、n("现有"+k+",存入"+amount+",余额"+a1.howmatch());}}publicstaticvoidmain(Stringargs[]){Account1a1=newAccount1();(newSave2(a1,100)).start();(newSave2(a1,200)).start();(newFetch2(a1,500)).start();}}classFetch2extendsThread//取款线程{privateAc