@synchronized (self)

@synchronized (self){ 
     //XXXX
}

Q:使用@synchronized (self)是对代码块的内容加锁,还是对self对象加锁?
@synchronized(对象)中的这个"对象"是什么,锁定它是为了什么
——这个对象可以是任意一个object,作用是以object的内存地址映射到系统维护的一个递归锁;当获得锁之后,其他线程想进入同一段代码时需要等待,其他线程想使用同一个object进行加锁时也需要等待

@synchronized (self)这种写法会根据给定的对象,自动创建一个锁,并等待块中的代码执行完毕。执行到这段代码结尾处,锁就释放了。
该同步方法的优点就是我们不需要在代码中显式的创建锁对象,便可以实现锁的机制。然而,滥用@synchronized (self)则会降低代码效率,因为公用同一个锁的那些同步块,都必须按顺序执行。若是在self对象上频繁加锁,程序可能要等另一段与此无关的代码执行完毕,才能继续执行当前代码,这样效率就低了。
注:因为@synchronized (self)方法针对self只有一个锁,相当于对于self的所有用到同步块的地方都是公用同一个锁,所以如果有多个同步块,则其他的同步块都要等待当前同步块执行完毕才能继续执行。

Q:如果在@synchronized (self)的代码块中进行异步操作,那异步操作未完成,锁就会被释放么?
代码块中进行异步操作,锁基本等于失效

==========================分割线===========================
在 sellTicket 中锁定了 self , 如果在 ticket 中没有用@synchronized(self),就会在sellTicket中线程运行的情况下,运行ticket中的线程,
如果用了@synchronized(self) 所有线程就会一个一个运行

@property (nonatomic, assign) NSInteger ticket;

- (void)viewDidLoad {
    [super viewDidLoad];
    _ticket = 50;
    [NSThread detachNewThreadSelector:@selector(sellTicket) toTarget:self withObject:nil];
    [NSThread detachNewThreadSelector:@selector(sellTicket) toTarget:self withObject:nil];
    [NSThread detachNewThreadSelector:@selector(ticket123) toTarget:self withObject:nil];
    [NSThread detachNewThreadSelector:@selector(sellTicket) toTarget:self withObject:nil];
    [NSThread detachNewThreadSelector:@selector(sellTicket) toTarget:self withObject:nil];
}

- (void)sellTicket {
  while (_ticket > 0) {
    [NSThread sleepForTimeInterval:3];
    @synchronized (self){ 
      if (_ticket > 0) {
          NSLog(@"123");
          [NSThread sleepForTimeInterval:3];
          self.ticket--;
          NSLog(@"%@  %ld ", [NSThread currentThread], _ticket);
      }
    }
  }
}

- (void)ticket123 {
// @synchronized (self) {
  for (int i = 0; i < 10; i++) {
    [NSThread sleepForTimeInterval:1];
    self.ticket--;
    NSLog(@"ticker %ld", _ticket);
   }
//}
}

锁一个对象 里面对他进行赋值操作会导致锁无效

http://mrpeak.cn/blog/synchronized/

你可能感兴趣的:(@synchronized (self))