ReadWriteLock 实例
ReadWriteLock 具有读写互斥,写同步,读并发的特点。在并发 访问频率 大于 并发修改的场合,ReadWriteLock 可以提高系统的性能。下面列举一个自学时编写,模拟ATM 存钱、取钱、查询的小例子。
package cn.com.ld.study.thread;/** * @filename: UserCount * @description: 银行账户 * @author lida * @date 2013-3-22 下午5:23:35 *//** * @filename: UserCount * @description: TODO * @author lida * @date 2013-3-22 下午5:25:19 *//** * @filename: UserCount * @description: TODO * @author lida * @date 2013-3-22 下午5:25:20 */public class UserCount {private int money;private String userName = "天朝";UserCount(int money) {this.money = money;}/** * @Title: saveMoney * @Description: 存钱 * @param 存入金额 * @return void */public void saveMoney(int money) {this.money += money;}/** * @Title: takeOutMoney * @Description: 取钱 * @param 支出金额 * @return int */public int takeOutMoney(int money) {if (this.money > money) {this.money -= money;} else {money = 0;}return money;}/** * @Title: getUserName * @Description: 账户查询 * @return String */public String getUserName() {return this.userName;}/** * @Title: getLeftMoney * @Description: 查询余额 * @return int */public int getLeftMoney() {return this.money;}}package cn.com.ld.study.thread;import java.util.concurrent.locks.Lock;/** * @filename: ATM * @description: 提款机 * @author lida * @date 2013-3-22 下午5:24:02 */public class ATM extends Thread {private Lock lock;// @Fields uc : 银行账户private UserCount uc;// @Fields money : 操作金额 private int money;// @Fields operType : 0:save ;1:takeOut ;2 getprivate int operType = 0;ATM(Lock lock, UserCount uc, int operType, int money) {this.lock = lock;this.uc = uc;this.operType = operType;this.money = money;}public void run() {lock.lock();long l1 = System.currentTimeMillis() ;if (0 == operType) {uc.saveMoney(money);System.out.println(this.getName() + " 存入 " + money + " 成功!");System.out.println(uc.getUserName() + " 当前余额为 " + uc.getLeftMoney());} else if (1 == operType) {int takeOutMoney = uc.takeOutMoney(money);System.out.println(this.getName() + " 取出 " + money+ (takeOutMoney > 0 ? " 成功!" : "失败,余额不足!"));System.out.println(uc.getUserName() + " 当前余额为 " + uc.getLeftMoney());} else if (2 == operType) {System.out.println(this.getName() + " 查询余额,当前余额为 " + money + " !");}try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}long l2 = System.currentTimeMillis() ;System.out.println("ATM 使用时长为:"+(l2-l1)/1000+" 秒 !");lock.unlock();}}package cn.com.ld.study.thread;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;/** * @filename: ReadWriteLockTest * @description: 模拟atm操作 * @author lida * @date 2013-3-22 下午5:27:59 */public class ReadWriteLockTest {public static void main(String[] args) {ReadWriteLock rw = new ReentrantReadWriteLock();//初始化银行账户为10000万元UserCount uc = new UserCount(10000);Lock wLock = rw.writeLock();Lock rLock = rw.readLock();ATM wSave = null;ATM wTakeOut = null;ATM rTakeOut = null; //5次存款 取款for (int i = 0; i < 5; i++) {wSave = new ATM(wLock, uc, 0, 1000);wTakeOut = new ATM(wLock, uc, 1, 1000);wSave.start();wTakeOut.start();} //10次余额查询for (int i = 0; i < 10; i++) {rTakeOut = new ATM(rLock, uc, 2, 1000);rTakeOut.start();}}}Thread-0 存入 1000 成功!天朝 当前余额为 11000ATM 使用时长为:3 秒 !Thread-1 取出 1000 成功!天朝 当前余额为 10000ATM 使用时长为:3 秒 !Thread-2 存入 1000 成功!天朝 当前余额为 11000ATM 使用时长为:3 秒 !Thread-3 取出 1000 成功!天朝 当前余额为 10000ATM 使用时长为:3 秒 !Thread-4 存入 1000 成功!天朝 当前余额为 11000ATM 使用时长为:3 秒 !Thread-5 取出 1000 成功!天朝 当前余额为 10000ATM 使用时长为:3 秒 !Thread-6 存入 1000 成功!天朝 当前余额为 11000ATM 使用时长为:3 秒 !Thread-7 取出 1000 成功!天朝 当前余额为 10000ATM 使用时长为:3 秒 !Thread-8 存入 1000 成功!天朝 当前余额为 11000ATM 使用时长为:3 秒 !Thread-9 取出 1000 成功!天朝 当前余额为 10000ATM 使用时长为:3 秒 !Thread-10 查询余额,当前余额为 1000 !Thread-11 查询余额,当前余额为 1000 !Thread-12 查询余额,当前余额为 1000 !Thread-13 查询余额,当前余额为 1000 !Thread-14 查询余额,当前余额为 1000 !Thread-15 查询余额,当前余额为 1000 !Thread-18 查询余额,当前余额为 1000 !Thread-16 查询余额,当前余额为 1000 !Thread-19 查询余额,当前余额为 1000 !Thread-17 查询余额,当前余额为 1000 !ATM 使用时长为:3 秒 !ATM 使用时长为:3 秒 !ATM 使用时长为:3 秒 !ATM 使用时长为:3 秒 !ATM 使用时长为:3 秒 !ATM 使用时长为:3 秒 !ATM 使用时长为:3 秒 !ATM 使用时长为:3 秒 !ATM 使用时长为:3 秒 !ATM 使用时长为:3 秒 !