Java併發之讀 寫鎖

2021-08-10 11:58:26 字數 2450 閱讀 3216

讀取:沒有執行緒正在做寫操作且沒有執行緒請求寫操作

寫入:沒有執行緒正在做寫操作

這裡假設寫操作的優先順序比讀操作高

當乙個執行緒已經擁有寫鎖,才允許寫鎖重入

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的執行權,優先順序較高的執行緒會不斷搶占資源。於是,就有了公平鎖。公平鎖可以保證執...