<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    keep moving!

    We must not cease from exploration. And the end of all our exploring will be to arrive where we began and to know the place for the first time.
    隨筆 - 37, 文章 - 2, 評論 - 3, 引用 - 0
    數(shù)據(jù)加載中……

    Design Pattern: Read-Write-Lock 模式

    如果有一個資料檔有可能同時間會有許多客戶端對它進(jìn)行讀取與寫入的動作,則必須注意資料的同步問題,像是兩個寫入者進(jìn)行寫入時,後一個寫入者的資料會有可能將次一個寫入者的資料覆蓋掉;而有時您希望讀取者看到的是最新的資料,如果在讀取的時候,有寫入者想要對資料進(jìn)行寫入,則最好等待讀取者讀取完畢,相反的如果在寫入時有客戶想要讀取資料,則最好等待,以確保讀出來的資料是最新的資料。

    讀取寫入的同步問題向來是難解的問題之一,有幾個可行的作法,例如若有寫入的動作時,則讀取者以唯讀模式開啟;或是如果有開啟資料檔的動作時,無論是讀取或是寫入,後一個開啟檔案的客戶都一律以唯讀模式開啟;還有最乾脆的作法,就是將這個問題由客戶決定,在開啟檔案時若已有其他人開啟中,則提供選項讓客戶決定要不要以唯讀模式開啟,通常這個作法是提供給檔案的擁有者使用。

    Read-Write-Lock 模式提供給被讀取或?qū)懭氲馁Y料「一把鎖」,在讀取或?qū)懭霑r都必須先取得這把鎖,讀取的客戶可以同時共同這把鎖,而寫入的客戶也可以共用這把鎖,但讀取不可與寫入共用一把鎖,如果嘗試取得鎖時發(fā)現(xiàn)鎖已經(jīng)被另一方取得,則等待直到鎖被釋放並重新取得它。

    下圖讀取者讀取資料時的Sequence Diagram示例:
    Read-Write-Lock

    現(xiàn)在假設(shè)讀取者已經(jīng)取得鎖,而寫入者試圖進(jìn)行寫入,它也試圖先取得鎖定,但發(fā)現(xiàn)鎖已經(jīng)被讀取的一方擁有,於是先進(jìn)入等待,直到讀取的一方解除鎖定為止:
    Read-Write-Lock

    一個簡單的Java程式例子如下所示:
     public void readData() {
        lock.readLock();
        doRead();
        lock.readUnLock();
     }

     public void writeData() {
        lock.writeLock();
        doWrite();
        lock.writeUnLock();
     }
     

    而最主要的關(guān)鍵還是在於鎖的實現(xiàn),在Java中可以用wait()、notify()來實現(xiàn),實現(xiàn)的片段如下:
     private boolean writerFirst = true; // 寫入優(yōu)先
     
     public synchronized void readLock() {
        try {
            while(writingWriters > 0 ||
                       (writerFirst && waitingWriters > 0)) {
                wait();
            }
        }
        catch(InterruptedException) {
        }

        readingReaders++;
     }
     
     public synchronized void readUnLock() {
        readingReaders--;
        writerFirst = true;
        notifyAll();
     }
     
     public synchronized void writeLock() {
        waitingWriters++
        try {
            while(readingReaders > 0 || writingWriters > 0) {
                wait();
            }
        }
        catch(InterruptedException) {
        }
        finally {
            waitingWriters--;
        }

        writingWriters++;
     }
     
     public synchronized void writeUnLock() {
        writingWriters--;
        writerFirst = false;
        notifyAll();
     }
     

    其中writerFirst是寫入優(yōu)先的旗標(biāo),它確保只要有寫入的執(zhí)行緒在等待時,在解除鎖定的時候,可以優(yōu)先由寫入執(zhí)行緒取得鎖定,以確保讀取者讀取到的資料可以是最新的,但缺點就是寫入的動作很頻繁時,讀取者必須等待的機會將增多,相反的若設(shè)定為讀取優(yōu)先,則讀取時的回應(yīng)性會增高,但資料更新的速率將會下降,實際使用時要偏好哪一方,必須視應(yīng)用的場合而定。

    張金鵬 2007-04-17 10:58 發(fā)表評論

    文章來源:http://www.tkk7.com/jesson2005/articles/111201.html

    posted on 2008-09-07 11:06 大石頭 閱讀(194) 評論(0)  編輯  收藏 所屬分類: 多線程

    主站蜘蛛池模板: 亚洲国产中文在线视频| 亚洲人成伊人成综合网久久久| 亚洲经典在线中文字幕| 最近更新免费中文字幕大全| 精品亚洲成α人无码成α在线观看| 亚洲欧美aⅴ在线资源| 成在人线AV无码免费| 亚洲人成网站免费播放| 在线成人a毛片免费播放| 亚洲人成色99999在线观看| 午夜a级成人免费毛片| 国产成人亚洲综合a∨| 久久人午夜亚洲精品无码区| 好吊妞在线成人免费| 真正全免费视频a毛片| 亚洲日本中文字幕天堂网| 中国国语毛片免费观看视频| 亚洲中文字幕无码中文字在线| 国产免费无码一区二区| 亚洲成年人免费网站| 午夜毛片不卡高清免费| 免费播放美女一级毛片| 亚洲精品无码高潮喷水在线| 久久精品国产免费一区| 亚洲人成人77777在线播放| 日本高清色本免费现在观看| 一级毛片免费视频网站| 无码久久精品国产亚洲Av影片| 日本zzzzwww大片免费| 亚洲AV无码成人精品区日韩 | 亚洲xxxx视频| 免费在线观看日韩| 两性色午夜视频免费网| 亚洲国产成人久久三区| 全部免费a级毛片| 亚欧免费一级毛片| 亚洲精华液一二三产区| 久久亚洲精品视频| 免费毛片网站在线观看| 国产一区二区免费视频| 亚洲精品无码mⅴ在线观看|