2012-01-21 4 views
2

私はすべてクラスオブジェクトに同期するメソッドのセットを持っています(このオブジェクトの複数のインスタンスが複数のスレッドで使用できるため、selfは使用できません)。これらのメソッドの中には、クラス内の他のメソッドを呼び出してクラスオブジェクトと同期させるものもあります。どういうわけか、これは動作し、私が期待するデッドロックを引き起こしません。この再帰的な同期呼び出しはデッドロックではありません。

私は、testBが既にクラスオブジェクトにロックを持っているので、testAが実行されていないと想定しますが、明らかにそうではありません。

@synchronizedがやっていることは何か特別なことですか、これは基本的なミューテックスロックの機能ですか?


作品例コード:

- (NSUInteger)testA 
{ 
    @synchronized(self.class) 
    { 
     NSLog(@"Doing something in A"); 
    } 
    return 1; 
} 

- (void)testB 
{ 
    @synchronized(self.class) 
    { 
     NSLog(@"Doing something in B"); 
     NSLog(@"A returned: %i", [self testA]); 
    } 
} 

TESTBを呼び出す場合、出力は次のようになります。

Doing something in B 
Doing something in A 
A returned: 1 
+5

ロックは通常はリエントラントなので、同じスレッドが同じロックを2回取得しようとすると、すでにロックを所有しているので、ロックを取得します。 –

答えて

11

マウリシオさんのコメントは正しいです。 TOCPLから:

Objective-Cの同期機能は、再帰とリエントラントコードをサポートしています。スレッドは、単一のセマフォを再帰的に複数回使用できます。スレッドが取得したロックをすべて解放するまで、他のスレッドはそのスレッドの使用をブロックされます。つまり、すべての@synchronized()ブロックが正常に終了するか、例外が発生します。

関連する問題