0
+ (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;
    }
}

好像有点矫枉过正。我想知道是否有更好的标准解决方案

4

1 回答 1

1

你可以在这里得到一个很好的例子和文档。

您可以只使用@synchronized(self)来同步操作。

于 2012-04-18T05:29:14.590 回答