簡體   English   中英

在Android中雙重檢查鎖定

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM