為計算結果建立高效、可伸縮的快取記憶體
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...