<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近java學到了多執行緒程式設計中的執行緒同步問題,教材中的取款小程式對於理解執行緒和執行緒同步很有幫助,在此將其補充完善.
1、建立java類
這裡建立了三個java類,第一個Account類,用於封裝賬戶中的各種資訊;第三個DrawThread類用於實現執行緒體;第二個類主要封裝了主函數
2、Account類
public class Account { //封裝賬戶編號,賬戶餘額和兩個成員變數 private String accountNo; private double balance; public Account(){}; public Account(String accountNo,double balance){ this.accountNo=accountNo; this.balance=balance; } public void setAccountNo(String accountNo) { this.accountNo=accountNo; } public void setBalance(double balance){ this.balance=balance; } public String getAccountNo(){ return accountNo; } public double getBalance(){ return balance; } public int hashCode(){ return accountNo.hashCode(); } public boolean equals(Object obj){ if(this==obj){ return true; } if (obj!=null&&obj.getClass()==Account.class){ Account target=(Account)obj; return target.getAccountNo().equals(accountNo); } return false; } }
3、DrawThread類
public class DrawThread extends Thread { //模擬使用者賬戶 private Account account; //當前取錢執行緒所希望的取錢數 private double drawAmount; public DrawThread(String name, Account account, double drawAmount) { super(name); this.account = account; this.drawAmount = drawAmount; } //當多個執行緒修改同一個共用資料時,將涉及資料安全問題 public void run() { //使用account作為同步監視器,任何執行緒進入下面同步程式碼塊之前 //必須先獲得對account賬戶的鎖定——其他執行緒無法獲得鎖,也就無法修改它 synchronized (account) { if (account.getBalance() >= drawAmount) { //吐出鈔票 System.out.println(getName() + "取錢成功!吐出鈔票:" + drawAmount); /* try { Thread.sleep(1); }catch (InterruptedException ex) { ex.printStackTrace(); } */ //修改餘額 account.setBalance(account.getBalance() - drawAmount); System.out.println("t餘額為:" + account.getBalance()); } else { System.out.println(getName() + "取錢失敗!餘額不足!"); } } } }
4、DrawTest類
public class DrawTest { public static void main(String[] args){ //建立一個賬戶 Account acct=new Account("1234567",1000); //模擬兩個執行緒對同一個賬戶取錢 new DrawThread("jack",acct,800).start(); new DrawThread("rose",acct,800).start(); } }
執行結果:
以上程式有一點需要注意,就是用到了同步程式碼塊。它可以解決run()方法不具備同步安全性(即當兩個執行緒同時傳送請求時即會造成異常)
同步程式碼塊:
synchronized (obj){ //需要執行的程式碼 }
如果我們去掉run()方法中的同步程式碼塊,繼續執行
Account acct=new Account("1234567",1000); new DrawThread("jack",acct,800).start(); new DrawThread("rose",acct,800).start();
(銀行賬戶一共1000元,Jack和rose分別對同一賬戶取錢)
執行結果:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45