亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁 Java Java入門 什麼是讀寫鎖

什麼是讀寫鎖

Aug 06, 2020 pm 05:04 PM
讀寫鎖

什麼是讀寫鎖

我們知道多個(gè)執(zhí)行緒同時(shí)讀一個(gè)資源類別是沒有任何問題的,所以在並發(fā)的情況下,讀取共享資源應(yīng)該是可以同時(shí)進(jìn)行的;但是,如果一個(gè)執(zhí)行緒想要去寫共享資源,就不應(yīng)該再有其他執(zhí)行緒同時(shí)對(duì)該共享資源進(jìn)行讀取或是寫操作了。

(推薦教學(xué):java入門教學(xué)

我們想要的是:允許多個(gè)執(zhí)行緒同時(shí)讀,但只要有一個(gè)執(zhí)行緒在寫,其他執(zhí)行緒就必須等待。

什麼是讀寫鎖

讀寫鎖定就是這個(gè)原理,即讀寫鎖在同一時(shí)刻可以允許多個(gè)多線程訪問,但是在寫線程訪問的時(shí)候,所有的讀取線程和其他寫線程都會(huì)被阻塞。讀寫鎖實(shí)際維護(hù)了一對(duì)鎖,一個(gè)讀鎖,一個(gè)寫鎖,透過分離讀鎖和寫鎖,使得其並發(fā)性比獨(dú)佔(zhàn)式鎖(排他鎖)有了很大的提升。

程式碼範(fàn)例:

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

讀取寫入鎖定的效率

(影片教學(xué)推薦:java影片教學(xué)

讀寫鎖是否會(huì)提高使用互斥鎖的效能取決於資料被讀取的頻率與被修改的頻率,讀取和寫入操作的持續(xù)時(shí)間以及資料的爭用,嘗試同時(shí)讀取或?qū)懭胭Y料的執(zhí)行緒數(shù)。?

例如最初填入資料的集合,然後經(jīng)常被修改的頻繁的搜尋(例如某種目錄)是使用讀寫鎖定的理想候選。然而,如果更新變得頻繁,那麼數(shù)據(jù)的大部分時(shí)間將被專門鎖定,並且並發(fā)性增加很少。

此外,如果讀取操作太短,則讀寫鎖定實(shí)作(其本身比互斥鎖更複雜)的開銷可以支配執(zhí)行成本,特別是因?yàn)樵S多讀寫鎖定實(shí)作仍將序列化所有線程通過小部分代碼。最終,只有剖析和測量將確定使用讀寫鎖是否適合您的應(yīng)用程式。

以上是什麼是讀寫鎖的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72