java holdslock_一种检测Java并发程序代码分支路径lock是否遗漏的方法
開發java程序中,程序員往往會用synchronized lock 進行臨界資源保護和線程同步;android平臺上,提供了一些技巧來減少鎖被錯誤使用:使用Locked后綴作為函數名字:Locked函數被調用,需調用方(或者更上層調用方)持鎖; 而此函數內部不能持有lock;通過這種編程約定的方式,可以減少死鎖和程序員加lock不全的場景。
由于程序員水平和程序本身的復雜性,仍舊存在一些代碼路徑忘記添加synchronized lock,導致一些低概率的并發問題。為了提早發現和定位這種問題,我們可以采用lock guard的方式進行檢測。主要思想是:在需要lock保護的代碼位置,增加是否已經持有需要lock的判斷,如果該位置沒有持有需要的lock,則證明存在錯誤。
實現方法1:
本身java Thread已經提供了如下方法,我們可以使用;Thread.holdsLock進行判斷;此方法優點是現成可用的,不需要我們開發太多的東西
簡單舉例:
private void updatePowerStateLocked(){
if (!mSystemReady || mDirty == 0) {
return;
}
if (!Thread.holdsLock(mLock)) {
Slog.wtf(TAG, "Power manager lock was not held when calling updatePowerStateLocked");
}
實現方法2:
在每個函數的頭部,增加一個java關鍵字或者在所有java對象的基類里面,例如GUARDED_BY(mLock)或者lock_guarded_by(Object obj)
private void updatePowerStateLocked() GUARDED_BY(mLock) {
或者:
private void updatePowerStateLocked() {
lock_guarded_by(Object obj);
}
第一種需要修改toolchain;第二種相比簡單些,以后研究一下;現在可以自己簡單實現一個函數,方法1
boolean lock_guarded_by(Object obj) {
return Thread.holdsLock(mLock);
}
總結
以上是生活随笔為你收集整理的java holdslock_一种检测Java并发程序代码分支路径lock是否遗漏的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java mongodb dbref_S
- 下一篇: java接口抽象方法_Java 接口 抽