我們知道多個線程同時讀一個資源類是沒有任何問題的,所以在并發(fā)的情況下,讀取共享資源應(yīng)該是可以同時進行的;但是,如果一個線程想要去寫共享資源,就不應(yīng)該再有其他線程同時對該共享資源進行讀或者是寫操作了。
成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),友好企業(yè)網(wǎng)站建設(shè),友好品牌網(wǎng)站建設(shè),網(wǎng)站定制,友好網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,友好網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。(推薦教程:java入門教程)
我們想要的是:允許多個線程同時讀,但只要有一個線程在寫,其他線程就必須等待。
讀寫鎖就是這個原理,即讀寫鎖在同一時刻可以允許多個多線程訪問,但是在寫線程訪問的時候,所有的讀線程和其他寫線程都會被阻塞。讀寫鎖實際維護了一對鎖,一個讀鎖,一個寫鎖,通過分離讀鎖和寫鎖,使得其并發(fā)性比獨占式鎖(排他鎖)有了很大的提升。
代碼示例:
public class ReadWriteLockDemo { public static void main(String[] args) { ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); Book book = new Book();//創(chuàng)建一本書,可讀可寫 //兩個寫手 for (int i = 0; i < 2; i++) { int num = i; new Thread(()->{ try { readWriteLock.writeLock().lock(); System.out.println("寫手"+num+"在寫文章"); book.write(String.valueOf(num),UUID.randomUUID().toString().substring(0,5)); }catch (Exception e){ e.printStackTrace(); }finally { readWriteLock.writeLock().unlock(); } },String.valueOf(i)).start(); } //6個讀者 for (int i = 0; i < 6; i++) { int num = i; new Thread(()->{ try { readWriteLock.readLock().lock(); String word = book.read(String.valueOf(num % 2)); System.out.println("讀者"+num+"在閱讀文章..."+word); } catch (Exception e) { e.printStackTrace(); } finally { readWriteLock.readLock().unlock(); } },String.valueOf(i)).start(); } } } class Book{ HashMapmap = new HashMap<>(); public void write(String key,String val){ map.put(key, val); } public String read(String key){ String word = map.get(key); return word; } }
輸出結(jié)果:
"C:\\Program Files\\Java\\jdk1.8.0_144\\bin\\java.exe" "-javaagent:F:\\MyDir\\IDEA\\IDEA2018\\IntelliJ IDEA 2018.2.4\\lib\\idea_rt.jar=54141:F:\\MyDir\\IDEA\\IDEA2018\\IntelliJ IDEA 2018.2.4\\bin" -Dfile.encoding=UTF-8 -classpath "C:\\Program Files\\Java\\jdk1.8.0_144\\jre\\lib\\charsets.jar;C:\\Program Files\\Java\\jdk1.8.0_144\\jre\\lib\\ext\\nashorn.jar;C:\\Program Files\\Java\\jdk1.8.0_144\\jre\\lib\\rt.jar;E:\\idea_workplace\\javaBase\\target\\classes" 寫手0在寫文章 寫手1在寫文章 讀者0在閱讀文章...6b021 讀者1在閱讀文章...220e4 讀者2在閱讀文章...6b021 讀者4在閱讀文章...6b021 讀者3在閱讀文章...220e4 讀者5在閱讀文章...220e4 Process finished with exit code 0
讀寫鎖的效率
(視頻教程推薦:java視頻教程)
讀寫鎖是否會提高使用互斥鎖的性能取決于數(shù)據(jù)被讀取的頻率與被修改的頻率,讀取和寫入操作的持續(xù)時間以及數(shù)據(jù)的爭用 ,嘗試同時讀取或?qū)懭霐?shù)據(jù)的線程數(shù)。
例如最初填充數(shù)據(jù)的集合,然后經(jīng)常被修改的頻繁的搜索(例如某種目錄)是使用讀寫鎖的理想候選。 然而,如果更新變得頻繁,那么數(shù)據(jù)的大部分時間將被專門鎖定,并且并發(fā)性增加很少。
此外,如果讀取操作太短,則讀寫鎖定實現(xiàn)(其本身比互斥鎖更復(fù)雜)的開銷可以支配執(zhí)行成本,特別是因為許多讀寫鎖定實現(xiàn)仍將序列化所有線程通過小部分代碼。 最終,只有剖析和測量將確定使用讀寫鎖是否適合您的應(yīng)用程序。
分享標題:什么是讀寫鎖
網(wǎng)址分享:http://weahome.cn/article/cjgjso.html