スレッド同期方法2(synchronized)
2744 ワード
package com.yli.thread.lock;
public class SynchronizedTest {
public static final int TOTAL_AMOUNT = 100000;
public static void main(String[] args) {
Bank2 bank = new Bank2("yli", TOTAL_AMOUNT);
Bank2 targetBank = new Bank2("ylz", 0);
System.out.println(Thread.currentThread().getName() + "=========> ="
+ (bank.getBalance() + targetBank.getBalance()));
for (int i = 0; i < 20000; i++) {
TransferBank2 transfer = new TransferBank2(bank, targetBank, 5);
Thread thread = new Thread(transfer);
thread.setName("Transfer-" + i);
thread.start();
}
}
}
class TransferBank2 implements Runnable {
private Bank2 bank;
private Bank2 targetBank;
private int amount;
public TransferBank2(Bank2 bank, Bank2 targetBank, int amount) {
this.bank = bank;
this.targetBank = targetBank;
this.amount = amount;
}
@Override
public void run() {
this.bank.transferAccount(targetBank, amount);
}
}
class Bank2 {
private String name;
private int balance;
public Bank2(String name, int balance) {
this.name = name;
this.balance = balance;
}
/**
* synchronized , ReentrantLock lock()+unlock()
* wait()+notifyAll() Condition.await() + Condition.singalAll()
* @param targetBank
* @param amount
*/
public synchronized void transferAccount(Bank2 targetBank, int amount) {
try {
while (this.balance < amount) {
this.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
this.balance -= amount;
targetBank.balance += amount;
int total = this.getBalance() + targetBank.getBalance();
System.out.println(Thread.currentThread().getName() + "=========> ="
+ total);
if (total != SynchronizedTest.TOTAL_AMOUNT) {
Thread.currentThread().interrupt();
try {
throw new InterruptedException("================> , ");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notifyAll();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public synchronized int getBalance() {
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
}