+ (GrabClass *)grab{
static GrabClass * ngrab = nil;
if (ngrab==nil)
{
ngrab=[[GrabClass alloc]init];
}
return grab;
}
我在我的程序中使用了许多单例。如果我这样做,但是有可能不同的线程同时调用grab方法。
如何避免?
我目前的解决方案是:
+ (GrabClass *)grab{
static GrabClass * ngrab = nil;
[Tools DoSomethingWithSynchronize:^{
if (ngrab==nil)
{
ngrab=[[GrabClass alloc]init];
}
}];
return grab;
}
在哪里
+(void)DoSomethingWithSynchronize:(void (^)())block
{
@synchronized (self)
{
[self singleton].lockToMakeSureThatOnlyOneThreadAccessThis=[NSThread currentThread];
[self breakIfLock]; //should not be called
block();
[self singleton].lockToMakeSureThatOnlyOneThreadAccessThis=nil;
}
}
好像有点矫枉过正。我想知道是否有更好的标准解决方案