模擬銀行開戶

 
/**
 * 面試題:模擬銀行賬戶
 * 對業務寫方法加鎖
 * 對業務讀方法不加鎖
 * 這樣行不行?
 *
 * 容易產生髒讀問題(dirtyRead)
 */
 
package com.mashibing.juc.c_008;
 
import java.util.concurrent.TimeUnit;
 
public class Account {
String name;
double balance;
public synchronized void set(String name, double balance) {
this.name = name;
 
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
 
 
this.balance = balance;
}
public /*synchronized*/ double getBalance(String name) {
return this.balance;
}
public static void main(String[] args) {
Account a = new Account();
new Thread(()->a.set("zhangsan", 100.0)).start();
 
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
 
System.out.println(a.getBalance("zhangsan"));
 
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
 
System.out.println(a.getBalance("zhangsan"));
}
}
 
出現0這個髒讀數據。
原因:加鎖方法和不加鎖方法是可以同步進行的,因爲加了鎖set方法尚未把balance賦值成功就進入睡眠,然後就會啓動未加鎖的getBalance方法,因爲balance此時爲賦製成功,故獲得的值爲0.當set方法睡眠時間過去,進入running狀態,此時balance賦值爲100
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章