`

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

分享到:
评论

相关推荐

    Objective-C高级编程 iOS与OS X多线程和内存管理_Objective-C_ios_

    书中会详细介绍这些机制的工作原理、使用方法以及它们之间的区别。例如,NSThread允许开发者创建并控制独立的执行线程,而NSOperationQueue则更注重任务的调度和优先级,提供了一种更为灵活的线程管理方式。GCD作为...

    Synchronized:将Objective-C的@synchronized指令公开给Swift

    与Objective-C指令类似,Synchronized获取一个互斥锁,运行一些代码,并在代码完成或引发异常时释放该锁。链接框架可通过获得同步。 要安装它,只需将以下行添加到您的Podfile中: pod "Synchronized", "~> 4.0"您...

    OC-@synchronized

    在Objective-C(简称OC)中,`@synchronized` 是一个关键字,用于实现线程同步,确保在同一时间只有一个线程可以执行特定代码块。线程同步是多线程编程中的重要概念,它防止了多个线程同时访问共享资源,从而避免...

    Objective-C 速查手册 1.2 (ARC版)

    本文将依据给定的“Objective-C速查手册1.2(ARC版)”内容,详细解析Objective-C的关键概念和使用技巧。 #### 二、类定义与实现 ##### 类头文件(.h) 在Objective-C中,每个类由两部分组成:类头文件和类实现...

    Objective-C高级编程 iOS与OS X多线程和内存管理

    《Objective-C高级编程:iOS与OS X多线程和内存管理》是一本深入探讨Objective-C在iOS和OS X平台上的核心特性的书籍。本书重点聚焦于多线程和内存管理两个关键领域,对于iOS和macOS应用开发人员来说,这是理解和优化...

    从C++到 Objective-c

    - **Objective-C** 的类定义更接近C语言的结构体,使用`struct`进行实现,而 **C++** 的类定义则更加强调面向对象的封装性。 ##### 2. 动态特性 - **Objective-C** 具有更强的动态性,支持运行时的消息发送机制。这...

    j2objcJava转成Objective-C的用于移植Android库到iOS

    2. **编译与链接**:转换后的Objective-C代码可以使用Xcode进行编译,生成对应的动态或静态库。在这个阶段,j2objc还会处理Java集合框架、异常处理、线程和其他特定于Java的特性。 3. **集成到iOS项目**:转换后的...

    NSLock和@synchronized

    接下来,我们将深入探讨这两种锁的使用方法、工作原理以及它们之间的差异。 首先,让我们看看`NSLock`。`NSLock`是Foundation框架提供的一种锁对象,它是线程安全的,可以通过调用`lock`和`unlock`方法来实现加锁和...

    Objective-C面试题.pdf

    - **异常**:Objective-C支持C语言风格的错误处理,但在iOS开发中较少使用。 #### 二、中级技术题 1. **Category与Extension**: - **Category**:为现有类添加新方法的一种方式,不改变原始类定义。 - **...

    objective-c单例模式的完整书写方式

    Objective-C中的单例模式是一种设计模式,用于在整个应用程序中确保只有一个特定类的实例存在,并提供一个全局访问点来获取这个实例。单例模式在iOS开发中广泛应用,特别是在管理共享资源、配置设置或网络请求等场景...

    OC-单例OC-单例OC-单例OC-单例OC-单例

    在iOS和Mac开发中,Objective-C(简称OC)是一种广泛使用的编程语言,尤其在Apple的UIKit框架下构建应用程序时。单例(Singleton)是软件设计模式中的一种,它确保一个类只有一个实例,并提供一个全局访问点。这个...

    详解iOS多线程之2.NSThread的加锁@synchronized

    `synchronized`是Objective-C中的一个关键字,它提供了一种互斥访问对象的机制,确保同一时间只有一个线程能执行特定代码块,从而避免竞态条件。在上面的例子中,`synchronized`被用在`sellTickets`方法内的代码块中...

    浅谈iOS中的锁的介绍及使用

    1. `@synchronized` 是Objective-C中的一个关键字,它提供了一种简单的方式来实现线程同步。使用 `@synchronized` 关键字时,你需要提供一个对象作为锁的标识,确保只有当这个对象相同的锁被持有时,代码块才会被...

    线程锁与Nscondition

    使用方法如下: ```objc NSCondition *condition = [[NSCondition alloc] init]; [condition lock]; while (资源不可用) { [condition wait]; // 等待条件满足 } // 临界区代码 [condition unlock]; // 释放...

    ios 设计模式

    在Objective-C中实现单例模式时,可以使用`+ (instancetype)sharedInstance`这样的方法来创建和返回单例对象。为了保证线程安全,通常会采用双重检查锁定的方式。下面是一个简单的单例模式实现示例: ```objective-...

    SingletonTest Demo代码

    在SingletonTest Demo中,开发者可以学习如何在Objective-C中正确地实现和使用Singleton模式,同时理解其在实际开发中的作用和价值。通过运行和分析Demo,能加深对Singleton的理解,并提高解决实际问题的能力。 ###...

    单例模式-ARC

    在iOS开发中,由于Objective-C的内存管理机制,特别是在引入Automatic Reference Counting(ARC)之后,实现单例模式有了新的方法和注意事项。 **单例模式的基本结构** 单例模式的核心是确保类的单例实例只有一个...

    iOS面试知识大纲

    - 对象导向:Objective-C是基于C语言的面向对象编程语言,它引入了类、继承、封装和多态等概念。 - 消息传递:Objective-C中的方法调用实际是消息传递,通过`[receiver message]`形式实现。 - Category:用于扩展...

    iOS工程师面试题.docx编程资料

    - **`@synchronized`:** 是Objective-C提供的一种简单的同步机制,可以防止多个线程同时进入某段代码。 - **GCD串行队列:** 可以用来实现同步执行任务。 - **GCD当中的屏障(block):** 也可以用来控制任务之间的...

Global site tag (gtag.js) - Google Analytics