今天同窗問到銀行存取款,如何保持同步,隨手寫了一個簡單例子.java
首先是銀行:ide
private int money = 1000;
public synchronized void add(int n) {
money += n;
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "----餘額: " + money);
}
public synchronized void reduce(int n) {
if(money - n >= 0) {
money -= n;
} else {
System.out.println("餘額不足");
}
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "----餘額: " + money);
}測試
其中關鍵在於方法加鎖,利用的是java內置的互斥鎖機制.this
接下來就是用戶:.net
public Bank bank;
static final String TYPE_ADD = "add";
static final String TYPE_REDUCE = "reduce";
private String type;
private int time;
private int money;
public Customer() {
}
public Customer(Bank bank, String type, int time, int money) {
this.bank = bank;
this.type = type;
this.time = time;
this.money = money;
}
@Override
public void run() {
for(int i = 0; i < time; i++) {
if (TYPE_ADD.equals(type)) {
bank.add(money);
} else if (TYPE_REDUCE.equals(type)) {
bank.reduce(money);
}
}
}get
最後是測試類:同步
Bank bank = new Bank();
Customer a1 = new Customer(bank, Customer.TYPE_ADD, 10, 100);
Customer a2 = new Customer(bank, Customer.TYPE_REDUCE, 10, 100);
Thread t1 = new Thread(a1);
Thread t2 = new Thread(a2);
t1.start();
t2.start();io