[英]Double checked locking in Android
根據許多人的說法,除非你運行1.5或更高版本並使用volatile
關鍵字,否則對於java來說,有些常見的Double-Checked Locking成語已被破壞。
一個破損的雙重檢查鎖定樣本:
// Broken multithreaded version
// "Double-Checked Locking" idiom
class Foo {
private Helper helper = null;
public Helper getHelper() {
if (helper == null)
synchronized(this) {
if (helper == null)
helper = new Helper();
}
return helper;
}
// other functions and members...
}
該示例來自本文,其中還提供了有關如何修復它的詳細信息: http : //www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
Pugh上面的分析是針對Java VM的。 我在Android上工作並經常使用采用Double-Checked Locking的庫。 dalvik VM的內存模型是否支持這個習慣用法?
這個問題的答案意味着內存模型應該是相同的,並且新的雙重檢查鎖定習慣將起作用。
我發現了一篇關於這個問題的非常好的文章: http : //www.javamex.com/tutorials/double_checked_locking_fixing.shtml
它清楚地說明了3種修復DCL的方法。 看起來在你的問題中,Helper字段應該被聲明為volatile,否則它不起作用。
在使用方面,即你的RoboGucie,我想我會贊成文章中提到的類加載器方法。 這對我來說更清楚,也更有效率。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.