2016-09-15 11 views
2

通常、オブジェクトを一意の参照のために@synchronized()ブロックに渡します。例えば、Objective Cでは、@synchronized()ブロックにnilまたはnullを渡すとどうなりますか?

+(id)sharedDBHandler 
{ 
    @synchronized (self) { 
     if (sDBHandler == nil) { 
      sDBHandler = [self new]; 
     } 
    } 
    return sDBHandler; 
} 

私たちはそれにnilを渡すとどうなりますか?

+0

はそれを試してみてください。何が起こった? – rmaddy

+2

FYI - 投稿したコードで 'nil'が' @synchronized'に渡されることはありません。 – rmaddy

+0

FYI - あなたが投稿したコードは、シングルトンを作成するための古くて古い方法です。代わりに 'dispatch_once'を使用してください。多くの例があります。 – rmaddy

答えて

6

@synchronize()はまったく行いません。ロックは取られません。いいえ。未定義の動作。

コードが陳腐化しており、もはやシングルトンを生成する正しい手段ではないかどうかにかかわらず、完全に有効な質問、btw。

githubリポジトリから。文書化された主張ではありませんが、このポリシーを破ることは互換性の地獄を引き起こします。

int objc_sync_enter(id obj) 
{ 
    int result = OBJC_SYNC_SUCCESS; 

    if (obj) { 
     SyncData* data = id2data(obj, ACQUIRE); 
     assert(data); 
     data->mutex.lock(); 
    } else { 
     // @synchronized(nil) does nothing 
     if (DebugNilSync) { 
      _objc_inform("NIL SYNC DEBUG: @synchronized(nil); set a breakpoint on objc_sync_nil to debug"); 
     } 
     objc_sync_nil(); 
    } 

    return result; 
} 

どこ:

BREAKPOINT_FUNCTION(
void objc_sync_nil(void) 
); 
+1

質問はなぜ有効ですか?それは全く何の努力もしていない。 OPは質問を投稿する前に、 'nil'で' @synchronized'を使って試してみました。その結果が明らかでない場合にのみ質問を掲示してください。最初に試してみることなくこのようなことを聞​​くだけでは適切ではありません。 – rmaddy

+0

この保証された動作、または未定義の動作の経験的な観察ですか?私が見つけた最も近いものは、渡されたオブジェクトがトークンと一意の識別子と呼ばれるhttps://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.htmlでした。これは、 'nil'は単なる特定のロックであり、ロックがないことを意味しません。私は実験的に、あなたが言っていることは今正しいと思っています。私が知っている限り、常にそうなっています。私はちょうど正式な確認を見つけることができません。 – Tommy

関連する問題