私はすべてクラスオブジェクトに同期するメソッドのセットを持っています(このオブジェクトの複数のインスタンスが複数のスレッドで使用できるため、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
ロックは通常はリエントラントなので、同じスレッドが同じロックを2回取得しようとすると、すでにロックを所有しているので、ロックを取得します。 –