//加锁之后 同一时刻 只允许一个线程访问 
 //数据修改前 加锁 
 [self.lock lock]; 
 num–; 
 NSLog(@”%@ num = %d”,[NSThread currentThread].name,num); 
 [NSThread sleepForTimeInterval:0.5]; 
 if(num == 0){ 
 break; 
 } 
 //数据修改后 解锁 
 [self.lock unlock];加锁单例
@implementation Single 
 //全局静态变量 
 static Single * single;+(instancetype)shareSingle{
//加锁 同一时刻只允许一个线程访问
@synchronized(self){
    if (!single) {
        single = [[Single alloc] init];
    }
}
//GCD加锁 dispatch_once_t只会执行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{

    single = [[Single alloc] init];
});
return single;
} 
 //重写这个方法 可以让我们用alloc创建的对象也是同一份对象 
 +(instancetype)allocWithZone:(struct _NSZone *)zone{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    single = [super allocWithZone:zone];
});
return single;
}
//copy的对象也是同一个对象 
 -(id)copyWithZone:(NSZone *)zone{
return single;

}