objective-c @synchronized 锁用法

 

Objective-C除了提供异常处理机制外,还提供了线程同步功能。异常处理在前面的“异常处理”章节有介绍。

线程的同步执行

Objective-C支持程序中的多线程。这就意味着两个线程有可能同时修改同一个对象,这将在程序中导致严重的问题。为了避免这种多个线程同时执行同一段代码的情况,Objective-C提供了@synchronized()指令。

指令@synchronized()通过对一段代码的使用进行加锁。其他试图执行该段代码的线程都会被阻塞,直到加锁线程退出执行该段被保护的代码段,也就是说@synchronized()代码块中的最后一条语句已经被执行完毕的时候。

指令@synchronized()需要一个参数。该参数可以使任何的Objective-C对象,包括self。这个对象就是互斥信号量。他能够让一个线程对一段代码进行保护,避免别的线程执行该段代码。针对程序中的不同的关键代码段,我们应该分别使用不同的信号量。只有在应用程序编程执行多线程之前就创建好所有需要的互斥信号量对象来避免线程间的竞争才是最安全的。

列表12-1的代码中使用self作为互斥信号量来实现当前对象对实例方法访问的同步。

  1. -(void)criticalMethod  
  2. {  
  3.     @synchronized(self)  
  4.     {  
  5.         //关键代码;  
  6.     }  
  7. }  


列表12-2 使用自定义的信号量来对方法加锁

  1. Account *account = [AccountaccoutFromString :[accountFiled stringValue]];  
  2.    
  3. //获取信号量  
  4. id accountSemaphore = [Account semaphore];  
  5. @synchronized(accountSemaphore)  
  6. {  
  7.     //关键代码  
  8. }  

Objective-C中的同步特性是支持递归的。一个线程是可以以递归的方式多次使用同一个信号量的;其他的线程会被阻塞知道这个线程释放了自己所有的和该信号量相关的锁,也就是说通过正常执行或者是通过异常处理的方式退出了所有的@synchronized()代码块。

当在@synchronized()代码块中抛出异常的时候, Objective-C运行时会捕获到该异常,并释放信号量,并把该异常重新抛出给下一个异常处理者。

相关推荐