+ (id) sharedInstance {
    static Singleton * instance;
    @synchronized(self) {
        if (instance==nil) {
            instance = [[self alloc] init];
        }   
    }
    return instance;
}

@synchronized를 쓰는 이유가 멀티스레드에서 안정성을 보장받기위해서 쓰는지는 다들 알텐데 이게 좀 느릴수가잇음


if(instance==nil)에서 스레드 두개가 동시에 호출할 경우에 문제가 생길수가 있으니 락을 걸어주긴 해야되는데  그래서 고안한게


+ (id) sharedInstance {
    static Singleton * instance;
    if (instance==nil) {
        @synchronized(self) {
            if (instance==nil) {
                instance = [[self alloc] init];
            }   
        }    
    }
    return instance;
}


이걸 DCL(Double Checked Locking)이라고 하는데 이게 앞에꺼보다 더 빠름.


싱글톤 암만 욕해도 쓸수밖에 없을때가 잇음