重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
今天寫課設項目的時候,在搭建后端的時候需要有一個讀寫鎖,大概實現的功能:
在訪問互斥資源的時候,當讀互斥資源時,如果沒有線程寫互斥資源,并且沒有線程等待去寫互斥資源時,那么就允許所有的讀線程進入。當寫互斥資源時,如果存在讀互斥資源的線程或者寫互斥資源的線程,那么就等待他們結束才能進入。
網上查閱了大量的資料,本來想著有沒有什么現成的可以用,可后來實在找不到了,如果讀者找到了求求私信告訴我一下(可憐巴巴)
可是然而我現在只會用synchronized,可synchronized只能相當于一把鎖,直接用顯然不現實,后來想到至少計算機系統課上寫的信號量原理,可是我不會原子層面操作,但是轉念一想,只要給變量操作那邊加一個synchronized(this),那不就相當于原子操作了嘛。(恍然大悟了一下,雖然有點騎驢找馬的感覺,繞了一大圈)
于是,我想寫一個滿足我第二段條件的讀寫鎖,也就有了本篇文章。
下面是我的代碼:
Lock_Write_Read.java:
public class Lock_Write_Read
{
int read=0;
int write=0;
boolean wait_write=false;
public void Get_Read() throws InterruptedException {
synchronized(this) {
while(write<0||wait_write){ //等到write全部釋放且沒有等待中的寫線程時才獲得鎖(即跳出循環)
wait();
}
read--;
}
}
public void Un_Read() {
synchronized(this) {
read++;
notify();
} //釋放寫線程
}
public void Get_Write() throws InterruptedException {
synchronized(this) {
while(write<0||read<0) {//等到write和read全部釋放才獲得鎖(即跳出循環)
wait_write=true; //將等待標志量點亮后等待被喚醒
wait();
}
write--;
}
}
public void Un_Write() {
synchronized(this) {
write++;
wait_write=false; //將等待標志位熄滅防止read進程進不來
notify();
}
}
}
利用上述一個類,只要我在寫數據之前調用對象的Get_Write(),寫完成后調用Un_Write(),就可以達到第二段那樣的目的(雖然這種方法像是以鎖套鎖,運行效率肯定不太好)
但如果會直接的原子操作或者有直接現成的這種功能的鎖可能會效率會比這種方法高得多。
如果讀者你找到了更好的方法,希望你能私信知會我一聲(卑微)
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧