多線程模式(六)Read-Write-Lock

1 鎖 

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

 public void writeData() {
    lock.writeLock();
    doWrite();
    lock.writeUnLock();
 }
    
  鎖的實現,在Java中可以用wait()、notify()來實現,實現的片段如下:
 private boolean writerFirst = true; // 寫入優先
 
 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是寫入優先的旗標,它確保只要有寫入的執行緒在等待時,在解除鎖定的時候,可以優先由寫入執行緒取得鎖定,以確保讀取者讀取到 的資料可以是最新的,但缺點就是寫入的動作很頻繁時,讀取者必須等待的機會將增多,相反的若設定為讀取優先,則讀取時的回應性會增高,但資料更新的速率將 會下降,實際使用時要偏好哪一方,必須視應用的場合而定。    
   
 

2. 擴展思考方向:


2.1 該模式利用同時讀取而不會產生衝突的特性,提高了程序的性能.

2.2 該模式適合讀取操作比較繁重的情況.

2.3 該模式適合讀取比寫入操作頻繁時.

2.4 鎖定的意義:

使用synchronized,可以獲取實例的鎖定.Java程序的每個實例各有一個"鎖定",同一個實例的鎖定無法由兩個以上的線程所獲取.這是制定在JAVA語言規格里,實現在Java執行環境裏的機制.故稱爲物理性的鎖定.Java程序無法去改變這種鎖定的行爲.
      
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章