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

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

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

    細心!用心!耐心!

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

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

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

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

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

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

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

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

    而最主要的關鍵還是在於鎖的實現(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)先的旗標,它確保只要有寫入的執(zhí)行緒在等待時,在解除鎖定的時候,可以優(yōu)先由寫入執(zhí)行緒取得鎖定,以確保讀取者讀取到的資料可以是最新的,但缺點就是寫入的動作很頻繁時,讀取者必須等待的機會將增多,相反的若設定為讀取優(yōu)先,則讀取時的回應性會增高,但資料更新的速率將會下降,實際使用時要偏好哪一方,必須視應用的場合而定。
    posted on 2007-04-17 10:58 張金鵬 閱讀(376) 評論(0)  編輯  收藏 所屬分類: 多執(zhí)行緒模式
    主站蜘蛛池模板: 国产精品国产午夜免费福利看| 亚洲精品乱码久久久久久不卡| 免费看美女裸露无档网站| 精品国产免费观看一区| 亚洲熟妇av午夜无码不卡| 一个人在线观看视频免费| 亚洲影视自拍揄拍愉拍| 毛片视频免费观看| 亚洲精品无码mⅴ在线观看| 国产精品亚洲一区二区三区 | 特级aa**毛片免费观看| 国产成人精品免费直播| 国产成人亚洲毛片| 亚洲性久久久影院| 亚洲a一级免费视频| 亚洲精品乱码久久久久久下载| 67194熟妇在线永久免费观看| 亚洲校园春色另类激情| 国产免费牲交视频| 久久成人18免费网站| 亚洲bt加勒比一区二区| 国产成人免费高清激情明星| 亚洲日韩人妻第一页| 成全高清在线观看免费| 四虎永久成人免费影院域名| 一级做a爰性色毛片免费| 久久亚洲AV午夜福利精品一区 | av永久免费网站在线观看| 亚洲va国产va天堂va久久| 无码免费又爽又高潮喷水的视频| 亚洲精品成人在线| 一级成人a毛片免费播放| 亚洲xxxx18| 亚洲女人被黑人巨大进入| 中文字幕视频免费| 亚洲天堂男人天堂| 永久免费av无码网站大全| 国产黄在线播放免费观看| 亚洲国产精品xo在线观看| 色欲色香天天天综合网站免费| tom影院亚洲国产一区二区|