package lock;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class TestReadWriteLock {
public static void main(String[] args) {
new TestReadWriteLock().run();
}
public void run(){
//创建并发访问的账户
Account myCount = new Account("95599200901215522", 10000);
//创建一个锁对象
ReadWriteLock lock = new ReentrantReadWriteLock(false);
//创建一个线程池
ExecutorService pool = Executors.newFixedThreadPool(2);
//创建一些并发访问用户,一个信用卡,存的存,取的取,好热闹啊
User u1 = new User("张三", myCount, -4000, lock, false);
User u2 = new User("张三他爹", myCount, 6000, lock, false);
User u3 = new User("张三他弟", myCount, -8000, lock, false);
User u4 = new User("张三", myCount, 800, lock, false);
User u5 = new User("张三他爹", myCount, 0, lock, true);
//在线程池中执行各个用户的操作
pool.execute(u1);
pool.execute(u2);
pool.execute(u3);
pool.execute(u4);
pool.execute(u5);
//关闭线程池
pool.shutdown();
}
class User implements Runnable{
private String name;
private int ioCash;
private Account myAccount;
private ReadWriteLock myLock;
private boolean isCheck;
public User(String name,Account myAccount,int ioCash, ReadWriteLock myLock, boolean isCheck) {
this.name = name;
this.ioCash = ioCash;
this.myAccount = myAccount;
this.myLock = myLock;
this.isCheck = isCheck;
}
@Override
public void run() {
if(isCheck){
myLock.readLock().lock();
System.out.println("Read>>"+name+" 正在查询。。。余额 "+myAccount.getCash());
myLock.readLock().unlock();
}else{
myLock.writeLock().lock();
System.out.println("Write>>"+name+" 当前余额: "+myAccount.getCash()+" 存入或取出:"+ioCash);
myAccount.setCash(myAccount.getCash()+ioCash);
System.out.println("Write>>"+name+" 当前余额:"+myAccount.getCash());
myLock.writeLock().unlock();
}
}
}
class Account{
private String id;
private int cash;
public Account(String id, int cash) {
super();
this.id = id;
this.cash = cash;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getCash() {
return cash;
}
public void setCash(int cash) {
this.cash = cash;
}
}
}
Write>>张三 当前余额: 10000 存入或取出:-4000
Write>>张三 当前余额:6000
Write>>张三他爹 当前余额: 6000 存入或取出:6000
Write>>张三他爹 当前余额:12000
Write>>张三他弟 当前余额: 12000 存入或取出:-8000
Write>>张三他弟 当前余额:4000
Write>>张三 当前余额: 4000 存入或取出:800
Write>>张三 当前余额:4800
Read>>张三他爹 正在查询。。。余额 4800
Write>>张三 当前余额:6000
Write>>张三他爹 当前余额: 6000 存入或取出:6000
Write>>张三他爹 当前余额:12000
Write>>张三他弟 当前余额: 12000 存入或取出:-8000
Write>>张三他弟 当前余额:4000
Write>>张三 当前余额: 4000 存入或取出:800
Write>>张三 当前余额:4800
Read>>张三他爹 正在查询。。。余额 4800