线程部分:
ReentrantLock类,演示如下:
ReentrantLock m_oReentrantLock = new ReentrantLock();
m_oReentrantLock.lock();
try {
} catch (Exception e) {
// TODO: handle exception
} finally {
m_oReentrantLock.unlock();
}
模拟存取款:
package com.xwj.account;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class AccountTest {
public static void main(String[] args) throws InterruptedException {
Bank m_oBank = new Bank();
ReentrantLock m_oReentrantLock = new ReentrantLock();
Condition m_oCondition = m_oReentrantLock.newCondition();
m_oBank.setM_nMoney(100);
m_oBank.setM_oReentrantLock(m_oReentrantLock);
m_oBank.setM_oCondition(m_oCondition);
Man_1 m_oMan_1 = new Man_1();
Man_2 m_oMan_2 = new Man_2();
m_oMan_1.setM_oBank(m_oBank);
m_oMan_2.setM_oBank(m_oBank);
m_oMan_1.start();
m_oMan_2.start();
Thread.sleep(1000);
System.out.println(m_oBank.getM_nMoney());
}
}
class Man_1 extends Thread {
private Bank m_oBank;
@Override
public void run() {
int i = 100;
while (i > 0) {
m_oBank.takeMoney(1);
int m_nMoney = m_oBank.getM_nMoney();
System.out.println("MAN_1>>" + m_nMoney);
i--;
}
}
public Bank getM_oBank() {
return m_oBank;
}
public void setM_oBank(Bank bank) {
m_oBank = bank;
}
}
class Man_2 extends Thread {
private Bank m_oBank;
@Override
public void run() {
int i = 100;
while (i > 0) {
m_oBank.saveMoney(1);
int m_nMoney = m_oBank.getM_nMoney();
System.out.println("MAN_2>>" + m_nMoney);
i--;
}
}
public Bank getM_oBank() {
return m_oBank;
}
public void setM_oBank(Bank bank) {
m_oBank = bank;
}
}
class Bank {
private int m_nMoney;
private ReentrantLock m_oReentrantLock;
private Condition m_oCondition;
public int saveMoney(int m_nSavedMoney) {
m_oReentrantLock.lock();
try {
m_nMoney += m_nSavedMoney;
m_oCondition.signalAll();
} finally {
m_oReentrantLock.unlock();
}
return m_nMoney;
}
public int takeMoney(int m_nTakeMoney) {
m_oReentrantLock.lock();
try {
if (m_nTakeMoney > m_nMoney) {
m_oCondition.await();
} else {
m_nMoney -= m_nTakeMoney;
m_oCondition.signalAll();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
m_oReentrantLock.unlock();
}
return m_nMoney;
}
public int getM_nMoney() {
return m_nMoney;
}
public void setM_nMoney(int money) {
m_nMoney = money;
}
public ReentrantLock getM_oReentrantLock() {
return m_oReentrantLock;
}
public void setM_oReentrantLock(ReentrantLock reentrantLock) {
m_oReentrantLock = reentrantLock;
}
public Condition getM_oCondition() {
return m_oCondition;
}
public void setM_oCondition(Condition condition) {
m_oCondition = condition;
}
}