Java併發 JAVA併發程式設計實戰 讀書筆記8

2021-07-23 23:57:05 字數 2126 閱讀 2853

為計算結果建立高效、可伸縮的快取記憶體

public inte***ce computable

public class expensivefunction implements computable

}public class memoizer1implements computable

public synchronized v compute(a arg)throws interruptedexception

return result;

}}

下面是一種改進。

public class memoizer2implements computable

public v comput(a arg)throws interruptedexception

return result;

}}

但是上面的**依然存在缺陷,當兩個執行緒同時呼叫compute

時,會造成他們計算相同的值。

public class memoizer3implements computable

public v compute(final a arg)throws interruptedexception

};futuretaskft=new futuretask(eval);

f=ft;

cache.put(arg,ft);

ft.run();//呼叫c.compute發生在這裡

}trycatch(executionexception e)

}}

上面的例子近乎完美,只存在乙個缺陷——兩個執行緒同時計算相同的值,但是遠沒有

memoizer2

的嚴重,僅僅因為

compute

中的if

**塊是非原子的檢查再執行。

快取乙個future

而不是乙個值會帶來快取汙染的可能性:如果乙個計算被取消或者失敗,未來嘗試對這個值計算都會失敗,所以如果計算被取消,就會把

future

從快取中移除。發現異常的時候也會移除。快取過期的問題可以通過

futuretask

的乙個子類來完成,他會為每乙個結果關聯乙個過期時間,並周期性地掃瞄快取中過期的訪問。

下面是memoizer的最終實現。

public class memoizerimplements computable

public v compute(final a arg)throws interruptedexception

};futuretaskft=new futuretask(eval);

f=cache.putifabsent(arg,ft);

if(f==null)

}trycatch(cancellationexception e)catch(executionexception e)

}}}

使用上面的**分解因式

public class factorizer implements servlet

}; private final computablecache = new memoizer(c);

public void service(servletrequest req,servletresponse resp)catch(interruptedexception e)

}}

下面我們總結一下

可變狀態,所有併發問題都歸結為如何協調訪問併發狀態,可變狀態越少,保證執行緒安全就越容易。

盡量將域宣告為final

型別,除非他們需要是可變的。

不可變的物件是執行緒安全的。

封裝使得管理複雜度變得更可行。

用鎖來守護每乙個可變變數。

對同一不變約束中的所有變數都使用相同的鎖。

在執行負荷操作期間持有鎖。

在非同步的多執行緒情況下,訪問可變變數的程式是存在隱患的。

不要依賴於可以需要同步的小聰明。

在設計過程中就考慮執行緒安全,或者在文件中明確地說明他不是執行緒安全的。

文件化你的同步策略。

Java併發 ReentrantLock實現分析

reentrantlock是基於aqs實現的可重入獨佔鎖,如果還不了解aqs實現原理的同學可以先去aqs原理分析學習一哈。如果文章中由任何不妥或者謬誤之處,請批評指正。2.公平鎖 3.解鎖過程 reentrantlock核心功能的實現,依賴於繼承aqs類實現的同步器。reentrantlock有三個...

JAVA併發程式設計

通過常量字串 string 來呼叫 wait 或 notify 方法所導致的問題是,jvm 編譯器會在內部自動將內容相同的 string 轉變為相同的物件。這意味著,即便你建立了兩個不同的 mywaitnotify 例項,他們內部的 mymonitorobject 變數也會指向相同的 string ...

Java併發程式設計

執行緒之間通訊 1.加鎖 object.wait 釋放鎖 object.notify 與sychronized 聯合使用,object lock new object sychronized lock sychronized lock 2.改進 無需加鎖並發包下 countdownlatch.awa...