线程

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

 

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

 

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

 

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

 

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

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

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

[cpp]   view plain copy
  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运行时会捕获到该异常,并释放信号量,并把该异常重新抛出给下一个异常处理者。


文章出处:http://blog.csdn.net/zhangxingping

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值