@synchronized不使用"锁定"和"解锁"来实现互斥吗?那怎么做锁定/解锁呢?
以下程序的输出仅为"Hello World".
@interface MyLock: NSLock<NSLocking>
@end
@implementation MyLock
- (id)init {
    return [super init];
}
- (void)lock {
    NSLog(@"before lock");
    [super lock];
    NSLog(@"after lock");
}
- (void)unlock {
    NSLog(@"before unlock");
    [super unlock];
    NSLog(@"after unlock");
}
@end
int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    MyLock *lock = [[MyLock new] autorelease];
    @synchronized(lock) {
        NSLog(@"Hello World");
    }
    [pool drain];
}
有人可以帮我理解下面的方法是做什么的吗?
+ (Game *) shared
{
    static Game *sharedSingleton;
    @synchronized(self)
    {
        if (!sharedSingleton)
        {
            sharedSingleton = [[Game alloc] init];
        }
    }
    return sharedSingleton;
}
在阅读了对Objective C中关于单例的问题的回答之后,似乎每个解决方案都在实例访问器中对线程进行了一些权衡.即
@synchronized(self)
{
    if (sharedInstance == nil)
            sharedInstance = [[MySingleton alloc] init];
}
return sharedInstance;
这基本上是单线程访问单例,如果它是在操作中经常使用的东西,看起来像是可能导致线程不必要地竞争的东西.
简单地使用类对象作为单例实例,并通过类方法公开功能,即
@interface MySingleton : NSObject {
}
+ (void)doSomething;
@end
@implementation MySingleton    
+ (void)initialize {
   //do some setup if necessary
}
+ (void)doSomething {
    //do something
}
@end
通过这种方式,我们避免每次想要引用单例对象时都进行锁定+检查,我们也可以省去将其存储在本地或方法ivar中.
此方法还允许运行时保证在任何给定时间系统中只存在一个实例(Class对象).
编辑
这里除了线程之外还有更多,使用传统的单例,您通常会编写如下代码:
MySingleton *instance = [MySingleton getSharedInstance];
NSObject *someResult = [instance getResult];
//or
if (instance.someProperty) {
  //do something
}
但是,如果你的单例是一个类实例,你基本上就不需要一直调用getSharedInstance.考虑以下代码:
NSObject *someResult = [MySingleton getResult];
//or
if ([MySingleton someProperty]) {
  //do …在我的应用程序中,后台sqlite线程正在运行...在后台线程中它从Web服务获取数据并将数据插入或更新到数据库中.如果用户从前台插入或删除数据,有时我会崩溃它显示"sqlite dblocked".但它不会返回sqlite busy错误.
我测试了线程安全模式
     NSLog(@" sqlite3_threadsafe() = %d", sqlite3_threadsafe());
它显示线程安全是2.
我想检查是否有其他数据库正在写数据,如果db正在写数据..我想在上一个写任务完成后写数据.
如何处理这些情况..