讀取:沒有執行緒正在做寫操作且沒有執行緒請求寫操作
寫入:沒有執行緒正在做寫操作
這裡假設寫操作的優先順序比讀操作高
當乙個執行緒已經擁有寫鎖,才允許寫鎖重入
public
class
readwritelock
writerequest--;
writeaccesses++;
writingthread = callingthread;
}public
synchronized
void
unlockwrite()
notifyall();
}private
boolean
cangrantwriteaccess(thread callingthread)
//是否有執行緒持有讀鎖
private
boolean
hasreaders()
//該執行緒是否擁有寫鎖
private
boolean
iswriter(thread callingthread)
}
有時候,我們希望乙個擁有讀鎖的執行緒,也可以獲得寫鎖。這時候需要這個執行緒是唯一乙個擁有讀鎖的執行緒。
public
class
readwritelock2
writerequest--;
writeaccesses++;
writingthread = callingthread;
}public
synchronized
void
unlockwrite()
notifyall();
}private
boolean
cangrantwriteaccess(thread callingthread)
private
boolean
hasreaders()
private
boolean
iswriter(thread callingthread)
//是唯一的讀鎖線程
private
boolean
isonlyreader(thread thread)
}
public
class
readwritelock3
readingthreads.put(callingthread, getreadaccesscount(callingthread) + 1);
}public
synchronized
void
unlockread()
int accesscount = getreadaccesscount(callingthread);
if (accesscount == 1)else
notifyall();
}public
synchronized
void
lockwrite()throws interruptedexception
writerequest--;
writeaccesses++;
writingthread = callingthread;
}public
synchronized
void
unlockwrite() throws interruptedexception
writeaccesses--;
if (writeaccesses == 0)
notifyall();
}private
boolean
cangrantreadaccess(thread callingthread)
private
boolean
cangrantwriteaccess(thread callingthread)
private
intgetreadaccesscount(thread callingthread)
private
boolean
hasreaders()
private
boolean
isreader(thread callingthread)
private
boolean
isonlyreader(thread callingthread)
private
boolean
haswriter()
private
boolean
iswriter(thread callingthread)
private
boolean
haswriterequest()
}
Java併發 讀寫鎖ReadWriteLock
讀寫鎖是為了幫助解決多執行緒中讀操作和寫操作分離而設計的。想象一下,如果在系統中,讀操作遠遠大於寫操作,而每一次寫操作進行時,別的寫操作也要等待,這樣對系統的效能會有很大的影響。readwritelock是jdk5開始提供的讀寫分離鎖。讀寫鎖允許多個執行緒同時讀,是的讀執行緒可以真正的並行。但是考慮...
java 高併發 之 鎖
synchronized 是屬於宣告式加鎖,可以修飾乙個 塊 乙個方法 乙個類,乙個靜態方法。修飾乙個 塊 public void test1 int j j,i 修飾乙個方法 public synchronized void test2 int j j,i 修飾乙個類 public static ...
Java併發之公平鎖
cpu在排程執行緒的時候,會在等待佇列裡隨機挑選乙個執行緒。由於隨機性,故不能保證執行緒先到先得 synchronized控制的鎖就是這種非公平鎖 這樣就會產生飢餓現象,即有些優先順序較低的執行緒可能永遠無法取得cpu的執行權,優先順序較高的執行緒會不斷搶占資源。於是,就有了公平鎖。公平鎖可以保證執...