學習軌道
/
Java
Java
/
練習
/
銀行帳戶
銀行帳戶

銀行帳戶

中等

簡介

經過多年填表和等待,你終於拿到銀行執照了。這代表你現在正式有資格開設屬於自己的銀行,太棒了!

你的第一要務,就是讓資訊系統順利運作起來。經過一整天的努力,你已經可以開立和關閉帳戶,也能處理提款和存款了。

因為你懶得寫測試,所以你邀請了幾位朋友來幫忙測試系統。然而,才過了五分鐘,其中一位朋友就說他們的錢不見了!雖然你對自己的程式碼很有信心,確信它沒有 bug,但你還是開始翻查日誌來調查。

啊,果然如你所料,是你的朋友有問題!他們把自己的測試憑證分享給另一位朋友,兩個人一起密謀,_同時_從同一個帳戶存款和提款。誰會做這種事啊?

當你主張一個人_不可能_同時存取自己的帳戶時,你的朋友得意地提醒你,銀行規則_要求_你必須支援這種情況。所以說,沒有支援並行銀行作業,就沒有上線的許可。你嘆了口氣,在心裡記下明天要處理這件事。這會讓你的上線日期_至少_再延後一天,不過,唉……

說明

你的任務是實作銀行帳戶,支援開戶/關閉帳戶、提款與存款。

由於銀行帳戶可以透過許多不同的方式存取(網路、手機、自動扣款),你的銀行軟體必須讓帳戶能被多個執行緒/行程(術語取決於你使用的程式語言)安全地平行存取。 例如,可能同時有許多筆存款與提款正在進行;你需要確保在讀取帳戶餘額與設定新餘額之間不會發生競爭條件。

帳戶應該要可以關閉;對已關閉帳戶進行的操作必須失敗。

實作

這個練習會帶你認識並行。 想通過最後一個測試,你可能會發現 synchronized關鍵字或鎖 很有用。

並行執行程式碼所產生的問題往往是間歇性的,因為它們取決於程式碼的執行順序。 因此,最後一個測試會執行許多執行緒好幾次,以提高抓到 bug 的機會。 這表示如果你的實作不是執行緒安全,這個測試應該會失敗;不過也有可能因為剛好沒有發生並行修改,就僥倖通過。 這種情況不太可能連續發生好幾次,因為每次執行測試時,程式碼的執行順序都應該會不同。 所以,如果你把最後一個測試執行個幾次,而且每次都通過,那就可以相當確定你的實作是正確的。

透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Java Exercism

準備好開始 銀行帳戶 了嗎?

註冊 Exercism,透過 26 個概念158 個練習 和真人引導來學習並精通 Java,全部免費。