讀寫鎖是什么?針對這個(gè)問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。
成都創(chuàng)新互聯(lián)IDC提供業(yè)務(wù):四川雅安服務(wù)器托管,成都服務(wù)器租用,四川雅安服務(wù)器托管,重慶服務(wù)器租用等四川省內(nèi)主機(jī)托管與主機(jī)租用業(yè)務(wù);數(shù)據(jù)中心含:雙線機(jī)房,BGP機(jī)房,電信機(jī)房,移動(dòng)機(jī)房,聯(lián)通機(jī)房。我們知道多個(gè)線程同時(shí)讀一個(gè)資源類是沒有任何問題的,所以在并發(fā)的情況下,讀取共享資源應(yīng)該是可以同時(shí)進(jìn)行的;但是,如果一個(gè)線程想要去寫共享資源,就不應(yīng)該再有其他線程同時(shí)對該共享資源進(jìn)行讀或者是寫操作了。
我們想要的是:允許多個(gè)線程同時(shí)讀,但只要有一個(gè)線程在寫,其他線程就必須等待。
讀寫鎖就是這個(gè)原理,即讀寫鎖在同一時(shí)刻可以允許多個(gè)多線程訪問,但是在寫線程訪問的時(shí)候,所有的讀線程和其他寫線程都會被阻塞。讀寫鎖實(shí)際維護(hù)了一對鎖,一個(gè)讀鎖,一個(gè)寫鎖,通過分離讀鎖和寫鎖,使得其并發(fā)性比獨(dú)占式鎖(排他鎖)有了很大的提升。
代碼示例:
public class ReadWriteLockDemo { public static void main(String[] args) { ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); Book book = new Book();//創(chuàng)建一本書,可讀可寫 //兩個(gè)寫手 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個(gè)讀者 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{ HashMap<String, String> map = 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
讀寫鎖的效率
讀寫鎖是否會提高使用互斥鎖的性能取決于數(shù)據(jù)被讀取的頻率與被修改的頻率,讀取和寫入操作的持續(xù)時(shí)間以及數(shù)據(jù)的爭用 ,嘗試同時(shí)讀取或?qū)懭霐?shù)據(jù)的線程數(shù)。
例如最初填充數(shù)據(jù)的集合,然后經(jīng)常被修改的頻繁的搜索(例如某種目錄)是使用讀寫鎖的理想候選。 然而,如果更新變得頻繁,那么數(shù)據(jù)的大部分時(shí)間將被專門鎖定,并且并發(fā)性增加很少。
此外,如果讀取操作太短,則讀寫鎖定實(shí)現(xiàn)(其本身比互斥鎖更復(fù)雜)的開銷可以支配執(zhí)行成本,特別是因?yàn)樵S多讀寫鎖定實(shí)現(xiàn)仍將序列化所有線程通過小部分代碼。 最終,只有剖析和測量將確定使用讀寫鎖是否適合您的應(yīng)用程序。
關(guān)于讀寫鎖是什么問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道了解更多相關(guān)知識。
本文標(biāo)題:讀寫鎖是什么-創(chuàng)新互聯(lián)
網(wǎng)站URL:http://m.newbst.com/article6/dpioig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、品牌網(wǎng)站制作、網(wǎng)站營銷、網(wǎng)頁設(shè)計(jì)公司、響應(yīng)式網(wǎng)站、動(dòng)態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容