读写锁ReadWriteLock
生活随笔
收集整理的這篇文章主要介紹了
读写锁ReadWriteLock
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
為了提高性能,Java提供了讀寫鎖,在讀的地方使用讀鎖,在寫的地方使用寫鎖,靈活控制,如果沒有寫鎖的情況下,讀是無阻塞的,在一定程度上提高了程序的執行效率。
Java中讀寫鎖有個接口java.util.concurrent.locks.ReadWriteLock,也有具體的實現ReentrantReadWriteLock,詳細的API可以查看JavaAPI文檔。ReentrantReadWriteLock 和 ReentrantLock 不是繼承關系,但都是基于 AbstractQueuedSynchronizer 來實現。
lock方法 是基于CAS 來實現的
注意: 在同一線程中,持有讀鎖后,不能直接調用寫鎖的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 Test {public static void main(String[] args) {//創建并發訪問的賬戶MyCount myCount = new MyCount("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 MyCount myCount; //所要操作的賬戶private int iocash; //操作的金額,當然有正負之分了private ReadWriteLock myLock; //執行操作所需的鎖對象private boolean ischeck; //是否查詢User(String name, MyCount myCount, int iocash, ReadWriteLock myLock, boolean ischeck) {this.name = name;this.myCount = myCount;this.iocash = iocash;this.myLock = myLock;this.ischeck = ischeck;}public void run() {if (ischeck) {//獲取讀鎖myLock.readLock().lock();System.out.println("讀:" + name + "正在查詢" + myCount + "賬戶,當前金額為" + myCount.getCash());//釋放讀鎖myLock.readLock().unlock();} else {//獲取寫鎖myLock.writeLock().lock();//執行現金業務System.out.println("寫:" + name + "正在操作" + myCount + "賬戶,金額為" + iocash +",當前金額為" + myCount.getCash());myCount.setCash(myCount.getCash() + iocash);System.out.println("寫:" + name + "操作" + myCount + "賬戶成功,金額為" + iocash +",當前金額為" + myCount.getCash());//釋放寫鎖myLock.writeLock().unlock();}} }/** class MyCount {private String oid; //賬號private int cash; //賬戶余額MyCount(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;}@Overridepublic String toString() {return "MyCount{" +"oid='" + oid + '\'' +", cash=" + cash +'}';} } 寫:張三正在操作MyCount{oid='95599200901215522', cash=10000}賬戶,金額為-4000,當前金額為10000 寫:張三操作MyCount{oid='95599200901215522', cash=6000}賬戶成功,金額為-4000,當前金額為6000 寫:張三他弟正在操作MyCount{oid='95599200901215522', cash=6000}賬戶,金額為-8000,當前金額為6000 寫:張三他弟操作MyCount{oid='95599200901215522', cash=-2000}賬戶成功,金額為-8000,當前金額為-2000 寫:張三正在操作MyCount{oid='95599200901215522', cash=-2000}賬戶,金額為800,當前金額為-2000 寫:張三操作MyCount{oid='95599200901215522', cash=-1200}賬戶成功,金額為800,當前金額為-1200 讀:張三他爹正在查詢MyCount{oid='95599200901215522', cash=-1200}賬戶,當前金額為-1200 寫:張三他爹正在操作MyCount{oid='95599200901215522', cash=-1200}賬戶,金額為6000,當前金額為-1200 寫:張三他爹操作MyCount{oid='95599200901215522', cash=4800}賬戶成功,金額為6000,當前金額為4800Process finished with exit code 0?
總結
以上是生活随笔為你收集整理的读写锁ReadWriteLock的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android监听SD卡文件变化
- 下一篇: java httpclient 为邮箱添