1 鎖
一個簡單的Java程式例子如下所示:lock.readLock();
doRead();
lock.readUnLock();
}
public void writeData() {
lock.writeLock();
doWrite();
lock.writeUnLock();
}
鎖的實現,在Java中可以用wait()、notify()來實現,實現的片段如下:
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程序無法去改變這種鎖定的行爲.