ReentrantReadWriteLock
所谓的读写锁,是访问资源共享共享锁、互斥锁,若是对资源加了写锁,其余线程没法获取写锁与读锁,可是持有写锁的线程,能够对资源
加读锁;若是一个线程对资源加了读锁,那么其余线程能够继续加读锁。读读共享、读写互斥、写写互斥
package dmeo9;public class MyAccount { private String oid; private int cash; public MyAccount(){ } public MyAccount(String oid, int cash) { this.oid = oid; this.cash = cash; } public String getOid() { return oid; } public void setOid(String oid) { this.oid = oid; } public int getCash() { return cash; } public void setCash(int cash) { this.cash = cash; }}package dmeo9;import java.util.concurrent.locks.ReadWriteLock;public class User implements Runnable { private String name;//用户名 private MyAccount myAccount;//操做的帐户 private int ioCash;//操做的金额 private ReadWriteLock readWriteLock;//读写锁操做锁须要的锁 private boolean isCheck;//是否操做? public User() { } public User(String name, MyAccount myAccount, int ioCash, ReadWriteLock readWriteLock, boolean isCheck) { this.name = name; this.myAccount = myAccount; this.ioCash = ioCash; this.readWriteLock = readWriteLock; this.isCheck = isCheck; } public String getName() { return name; } public void setName(String name) { this.name = name; } public MyAccount getMyAccount() { return myAccount; } public void setMyAccount(MyAccount myAccount) { this.myAccount = myAccount; } public int getIoCash() { return ioCash; } public void setIoCash(int ioCash) { this.ioCash = ioCash; } public ReadWriteLock getReadWriteLock() { return readWriteLock; } public void setReadWriteLock(ReadWriteLock readWriteLock) { this.readWriteLock = readWriteLock; } public boolean isCheck() { return isCheck; } public void setCheck(boolean check) { isCheck = check; } @Override public void run() { if (isCheck) { /*获取读锁*/ try { readWriteLock.readLock().lock(); System.err.println("\n读:" + getName() + "\t正在read 查询\t" + getMyAccount() + "\t帐户,当前金额为:" + myAccount.getCash()); } catch (Exception e) { e.printStackTrace(); } finally { /*释放读锁*/ readWriteLock.readLock().unlock(); } } else { /*获取写的锁*/ try { readWriteLock.writeLock().lock(); System.err.println("写:" + getName() + "\t正在write 操做\t" + getMyAccount() + "帐户,当前金额为:" + myAccount.getCash()); getMyAccount().setCash(getMyAccount().getCash() + getIoCash()); System.err.println("操做成功:金额为" + getIoCash() + "\t当前金额为:" + getMyAccount().getCash()+"\n\n"); } catch (Exception e) { e.printStackTrace(); } finally { /*释放写锁*/ /** * 通常用lock或者 readwritelock时,须要把 unlock方法放在一个 fianlly 块中,由于程序运行的时候可能会 出现一些咱们人为控制不了的因素,致使锁一直没释放,那其余线程就进不来了. */ readWriteLock.writeLock().unlock(); } } }}package dmeo9;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;public class DemoReadWriteLock { public static void main(String[] args){ MyAccount myAccount = new MyAccount("工商银行95599200901215522",160000); ReadWriteLock readWriteLock = new ReentrantReadWriteLock(false); ExecutorService executorService = Executors.newFixedThreadPool(2); User u1 = new User("张三", myAccount, -4000, readWriteLock, false); User u2 = new User("小明", myAccount, 6000, readWriteLock, false); User u3 = new User("小明", myAccount, -8000, readWriteLock, false); User u4 = new User("小明", myAccount, 800, readWriteLock, false); User u5 = new User("小明他爹", myAccount, 0, readWriteLock, true); executorService.execute(u1); executorService.execute(u2); executorService.execute(u3); executorService.execute(u4); executorService.execute(u5); /*关闭线程池*/ executorService.shutdown(); }}输出:写:张三 正在write 操做 dmeo9.MyAccount@1a8fdcaa帐户,当前金额为:160000 操做成功:金额为-4000 当前金额为:156000 写:小明 正在write 操做 dmeo9.MyAccount@1a8fdcaa帐户,当前金额为:156000 操做成功:金额为6000 当前金额为:162000 写:小明 正在write 操做 dmeo9.MyAccount@1a8fdcaa帐户,当前金额为:162000 操做成功:金额为-8000 当前金额为:154000 写:小明 正在write 操做 dmeo9.MyAccount@1a8fdcaa帐户,当前金额为:154000 操做成功:金额为800 当前金额为:154800 读:小明他爹 正在read 查询 dmeo9.MyAccount@1a8fdcaa 帐户,当前金额为:154800