日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java怎么写算法_关于读写锁算法的Java实现及思考

發(fā)布時間:2025/4/5 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java怎么写算法_关于读写锁算法的Java实现及思考 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

問題背景:多個線程對一個共享的資源進行讀寫訪問。寫線程之間需要互斥,讀線程跟寫線程需要互斥,讀線程之間不用互斥。

早些時候聽張sir的課,講述java5中增強并發(fā)的功能。用java.util.concurrent.locks中ReadWriteLock 可以輕松解決讀寫鎖問題。我在思考如果沒有ReadWriteLock,單靠synchronized可以怎樣做呢? 的確,比較麻煩。

1.結(jié)合張sir傳授的面向?qū)ο蟮脑O(shè)計思想,首先設(shè)計一個業(yè)務(wù)類Business作為共享資源,封裝write跟read方法。

2.因為write必定互斥,所以直接定義synchronized。

3.read之間不要互斥 所以read 不能直接定義synchronized的 但是 write跟read 需要互斥 如何控制 我想到的一個方法是在read里 加入synchronized(this){} 同時定義readThreads計數(shù)器作為信號量 我試想下會出現(xiàn)下面幾種情況:

read[m]表示某個線程的read方法 。

write[n] 同上

1>read[m]中執(zhí)行到synchronized(this){readThreads++;}時 write[n]來了 write[n] 會被自身的synchronized阻塞。

2>read[m]在do something(此時無鎖)時 write[n] 來了 因為 readThreads!=0 而被迫wait。

3> 每次read[m]結(jié)束時 wait中的write[n]會被notify 但如果發(fā)現(xiàn)還有其他的read的話 write[n] 只能無奈地再次wait。

4>當(dāng)readThreads==0并且調(diào)用notifyAll 時 read[m] 和 write[n] 會競爭cpu 如果write[n]再次落敗,則會出現(xiàn)1>或3> ; 如果成了,則如下:

5> 如果write[n] wait中醒來占鎖,read[m]被阻塞synchronized(this){readThreads++;}之上。

6>如果被阻塞的write[n]占鎖,read[m]被阻塞synchronized(this){readThreads++;}之上。

從以上看來read 和 write 是互斥的。

4.實現(xiàn)細節(jié)如下:

packagecommunication;

importjava.util.Random;

publicclassReadWriteLockTest?{

publicstaticvoidmain(String[]?args){

finalBusiness?business?=newBusiness();

//啟動4線程?2讀?2寫

for(inti=1;i<=2;i++){

newThread(newRunnable(){

publicvoidrun()?{

for(intj=1;j<1000;j++){

business.read();

try{

Thread.sleep(900);

}catch(InterruptedException?e)?{

e.printStackTrace();

}

}

}

}).start();

newThread(newRunnable(){

publicvoidrun()?{

Random?r?=newRandom();

for(intj=1;j<1000;j++){

inti?=?r.nextInt(100);

business.write(i);

try{

Thread.sleep(1000);

}catch(InterruptedException?e)?{

e.printStackTrace();

}

}

}

}).start();

}

}

}

//封裝的業(yè)務(wù)類

classBusiness{

privateintdata=0;//共享資源屬性

privateintreadThreads?=0;//讀線程數(shù)

//private?boolean?isWriting??=?false;

//是否執(zhí)行寫?后來發(fā)現(xiàn)不需要?當(dāng)write搶占鎖時?所有的read?都被擋在synchronized?(this){}之上?無機會執(zhí)行wait

publicvoidread(){

synchronized(this)?{

/*while(isWriting){

try?{

this.wait();

}?catch?(InterruptedException?e)?{

//?TODO?Auto-generated?catch?block

e.printStackTrace();

}

}*/

//readThreads不被鎖的話?會出現(xiàn)read和write不互斥的小概率事件?導(dǎo)致線程不安全

readThreads++;

}

System.out.println(Thread.currentThread().getName()+"?read?begin");

System.out.println(Thread.currentThread().getName()+"?read:"+data);

System.out.println(Thread.currentThread().getName()+"?read?finish");

synchronized(this)?{

readThreads--;

this.notifyAll();

}

}

publicsynchronizedvoidwrite(inti){

while(readThreads?!=0){//當(dāng)read?正處于do?something狀態(tài)時?來個write?那就只有等等先了

try{

this.wait();

}catch(InterruptedException?e)?{

e.printStackTrace();

}

}

//isWriting?=?true;

System.out.println(Thread.currentThread().getName()+"?write?start");

data?=?i;

System.out.println(Thread.currentThread().getName()+"?write:"+i);

System.out.println(Thread.currentThread().getName()+"?write?over");

//isWriting?=?false;

this.notifyAll();

}

}

思考中:

5.當(dāng)讀頻繁時 readThreads會長時間!= 0 寫線程會餓死 這個可以如何解決?

【編輯推薦】

【責(zé)任編輯:小林 TEL:(010)68476606】

點贊 0

總結(jié)

以上是生活随笔為你收集整理的java怎么写算法_关于读写锁算法的Java实现及思考的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。