2016-09-26 4 views
1
private readonly Object _syncRoot = new Object(); 
public IdGenerator ClientIdGenerator 
{ 
    get 
    { 
     if (clientIdGenerator != null) 
      return clientIdGenerator; 

     lock (_syncRoot) 
     { 
      if (clientIdGenerator != null) 
       return clientIdGenerator; 

      return clientIdGenerator = ClientIdPrefix != null ? new IdGenerator(ClientIdPrefix) : new IdGenerator(); 
     } 
    } 
} 

IdGeneratorのインスタンスを作成している行で、「Double-Check Lockingパターンの不正な実装が可能です。私はこれにコードを変更した後R# - Double-Check Lockingパターンの誤った実装の可能性があります。

R#が警告を表示しません:

public IdGenerator ClientIdGenerator 
{ 
    get 
    { 
     if (clientIdGenerator == null) 
      lock (_syncRoot) 
      { 
       if (clientIdGenerator != null) 
        return clientIdGenerator; 

       clientIdGenerator = ClientIdPrefix != null ? new IdGenerator(ClientIdPrefix) : new IdGenerator(); 
      } 
     return clientIdGenerator; 
    } 
} 

は、最初の例に何か問題ですか、「間違った」という警告を表示するのR#のですか?

+1

あなたの最初のバージョンはうまく動作するはずです。このケースでは、resharperコード解析エンジンが誤解を招くと強く思っています。 –

+0

私もそう思った...ありがとう! – musium

答えて

1

あなたの最初のバージョンはうまく動作するはずですが、ちょうどコード分析エンジンや同僚の一部に誤解を避けるために、あなたは標準パターンを使用することができます:あなたがあなたの意図をクリア作る

private readonly Object _syncRoot = new Object(); 
public IdGenerator ClientIdGenerator 
{ 
    get 
    { 
     if (clientIdGenerator == null) 
     { 
      lock (_syncRoot) 
      { 
       if (clientIdGenerator == null) 
       { 
        clientIdGenerator = ClientIdPrefix != null ? new IdGenerator(ClientIdPrefix) : new IdGenerator(); 
       } 
      } 
     } 

     return clientIdGenerator; 
    } 
} 

この道を。

関連する問題