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

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

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

    細(xì)心!用心!耐心!

    吾非文人,乃市井一俗人也,讀百卷書(shū),跨江河千里,故申城一游; 一兩滴辛酸,三四年學(xué)業(yè),五六點(diǎn)粗墨,七八筆買(mǎi)賣(mài),九十道人情。

    BlogJava 聯(lián)系 聚合 管理
      1 Posts :: 196 Stories :: 10 Comments :: 0 Trackbacks
    如果有一個(gè)資料檔有可能同時(shí)間會(huì)有許多客戶端對(duì)它進(jìn)行讀取與寫(xiě)入的動(dòng)作,則必須注意資料的同步問(wèn)題,像是兩個(gè)寫(xiě)入者進(jìn)行寫(xiě)入時(shí),後一個(gè)寫(xiě)入者的資料會(huì)有可能將次一個(gè)寫(xiě)入者的資料覆蓋掉;而有時(shí)您希望讀取者看到的是最新的資料,如果在讀取的時(shí)候,有寫(xiě)入者想要對(duì)資料進(jìn)行寫(xiě)入,則最好等待讀取者讀取完畢,相反的如果在寫(xiě)入時(shí)有客戶想要讀取資料,則最好等待,以確保讀出來(lái)的資料是最新的資料。

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

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

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

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

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

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

    而最主要的關(guān)鍵還是在於鎖的實(shí)現(xiàn),在Java中可以用wait()、notify()來(lái)實(shí)現(xiàn),實(shí)現(xiàn)的片段如下:
     private boolean writerFirst = true; // 寫(xiě)入優(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是寫(xiě)入優(yōu)先的旗標(biāo),它確保只要有寫(xiě)入的執(zhí)行緒在等待時(shí),在解除鎖定的時(shí)候,可以優(yōu)先由寫(xiě)入執(zhí)行緒取得鎖定,以確保讀取者讀取到的資料可以是最新的,但缺點(diǎn)就是寫(xiě)入的動(dòng)作很頻繁時(shí),讀取者必須等待的機(jī)會(huì)將增多,相反的若設(shè)定為讀取優(yōu)先,則讀取時(shí)的回應(yīng)性會(huì)增高,但資料更新的速率將會(huì)下降,實(shí)際使用時(shí)要偏好哪一方,必須視應(yīng)用的場(chǎng)合而定。
    posted on 2007-04-17 10:58 張金鵬 閱讀(376) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 多執(zhí)行緒模式
    主站蜘蛛池模板: 野花香在线视频免费观看大全| 亚洲视频网站在线观看| 国产精品亚洲一区二区无码| 亚洲免费在线视频播放| 亚洲婷婷综合色高清在线| 5555在线播放免费播放| 亚洲日韩国产精品乱| 青青操免费在线观看| 亚洲AV色香蕉一区二区| 91精品国产免费入口| 亚洲www在线观看| 女人18毛片a级毛片免费 | 亚洲综合激情六月婷婷在线观看| 久久aa毛片免费播放嗯啊| 亚洲理论片中文字幕电影| 无人在线直播免费观看| 亚洲国产成人久久一区二区三区| 国产一区二区视频免费| 中文字幕手机在线免费看电影 | 久久久久亚洲精品天堂久久久久久| jizz免费一区二区三区| 亚洲精品免费视频| 国语成本人片免费av无码| 免费夜色污私人影院网站| 亚洲人成77777在线播放网站| 久久国产乱子伦免费精品| 亚洲乱码中文字幕在线| 在线观看亚洲天天一三视| 最近2019中文字幕免费直播| 亚洲av无码专区国产不乱码| 亚洲精品无码不卡在线播HE | 亚洲午夜成激人情在线影院| 国产伦精品一区二区三区免费迷| 一级**爱片免费视频| 亚洲第一页在线视频| 亚洲第一区在线观看| 四虎在线免费视频| 免费无毒a网站在线观看| 亚洲精品成人久久| 亚洲精品成人在线| 青青青国产在线观看免费 |