Java銀行取錢線程安全問題實(shí)例分析
本文實(shí)例講述了Java銀行取錢線程安全問題。分享給大家供大家參考,具體如下:
一 定義一個(gè)賬戶類
public class Account { // 封裝賬戶編號(hào)、賬戶余額的兩個(gè)成員變量 private String accountNo; private double balance; public Account(){} // 構(gòu)造器 public Account(String accountNo , double balance) { this.accountNo = accountNo; this.balance = balance; } // 此處省略了accountNo和balance的setter和getter方法 // accountNo的setter和getter方法 public void setAccountNo(String accountNo) { this.accountNo = accountNo; } public String getAccountNo() { return this.accountNo; } // balance的setter和getter方法 public void setBalance(double balance) { this.balance = balance; } public double getBalance() { return this.balance; } // 下面兩個(gè)方法根據(jù)accountNo來重寫hashCode()和equals()方法 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; } }
二 定義一個(gè)取錢線程
public class DrawThread extends Thread { // 模擬用戶賬戶 private Account account; // 當(dāng)前取錢線程所希望取的錢數(shù) private double drawAmount; public DrawThread(String name , Account account , double drawAmount) { super(name); this.account = account; this.drawAmount = drawAmount; } // 當(dāng)多條線程修改同一個(gè)共享數(shù)據(jù)時(shí),將涉及數(shù)據(jù)安全問題。 public void run() { // 賬戶余額大于取錢數(shù)目 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() + "取錢失?。∮囝~不足!"); } } }
三 測(cè)試主類
public class DrawTest { public static void main(String[] args) { // 創(chuàng)建一個(gè)賬戶 Account acct = new Account("1234567" , 1000); // 模擬兩個(gè)線程對(duì)同一個(gè)賬戶取錢 new DrawThread("甲" , acct , 800).start(); new DrawThread("乙" , acct , 800).start(); } }
四 運(yùn)行
乙取錢成功!吐出鈔票:800.0
甲取錢成功!吐出鈔票:800.0
余額為: 200.0
余額為: -600.0
五 說明
賬戶余額只有1000時(shí)取出1600,而且賬戶余額出現(xiàn)了負(fù)數(shù),這部是銀行希望看到的結(jié)果。
雖然上面程序是人為地使用Thread.sleep(1)
來強(qiáng)制線程調(diào)度切換,但這種切換是完全可能發(fā)生的。
更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java進(jìn)程與線程操作技巧總結(jié)》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
相關(guān)文章
win10系統(tǒng)64位jdk1.8的下載與安裝教程圖解
這篇文章主要介紹了win10系統(tǒng)64位jdk1.8的下載與安裝教程圖解,本文給大家介紹的非常詳細(xì),對(duì)大家的工作或?qū)W習(xí)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03Java工程mybatis實(shí)現(xiàn)多表查詢過程詳解
這篇文章主要介紹了Java工程mybatis實(shí)現(xiàn)多表查詢過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06IDEA2020.1啟動(dòng)SpringBoot項(xiàng)目出現(xiàn)java程序包:xxx不存在
這篇文章主要介紹了IDEA2020.1啟動(dòng)SpringBoot項(xiàng)目出現(xiàn)java程序包:xxx不存在,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06聊聊@RequestParam,@PathParam,@PathVariable等注解的區(qū)別
這篇文章主要介紹了聊聊@RequestParam,@PathParam,@PathVariable等注解的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02使用Spring Boot創(chuàng)建Web應(yīng)用程序的示例代碼
本篇文章主要介紹了使用Spring Boot創(chuàng)建Web應(yīng)用程序的示例代碼,我們將使用Spring Boot構(gòu)建一個(gè)簡單的Web應(yīng)用程序,并為其添加一些有用的服務(wù),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05SpringBoot項(xiàng)目中處理返回json的null值(springboot項(xiàng)目為例)
本文以spring boot項(xiàng)目為例給大家介紹SpringBoot項(xiàng)目中處理返回json的null值問題,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下2019-10-10Java?超詳細(xì)講解對(duì)象的構(gòu)造及初始化
面向?qū)ο竽耸荍ava語言的核心,是程序設(shè)計(jì)的思想。Java語言的面向?qū)ο蠹夹g(shù)包括了面向?qū)ο蠛兔嫦蜻^程的基本概念,面向?qū)ο蟮奶卣鳎琂ava語言的類,對(duì)象,修飾符,抽象類等一系列的知識(shí)點(diǎn)2022-03-03