`
lizaochengwen
  • 浏览: 664639 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

@synchronized()

阅读更多
Objective-c支持多线程的应用程序。 这意味着,两个线程可以尝试修改在同一时间相同的对象,这种情况可能导致在程序中的严重问题。 为了保护代码部分在一个时间被执行在多个线程,Objective - C提供了@synchronized()同步指令。




在@ synchronized()指令锁定的的代码段由单个线程使用。其他线程被阻塞,直到该线程退出保护的代码; 也就是说,只有在过去的最后声明后才继续执行@ synchronized()块再见哦那个的代码。




@ synchronized()指令作为任何 Objective - C对象和它自己唯一的参数。这个对象被称 为一个相互排斥或互斥信号量。它允许一个线程锁定代码段以防止其他线程使用。您应该使用单独的信号量来保护一个程序的不同关键部分。在创造一切相互排斥成为多线程应用程序之前,这样做是最安全的,以避免竞争条件。




清单10-1 显示了一个代码示例采用自同步的互斥访问当前对象的实例方法。你可以采取类似的方法来同步相关类的类的方法,使用类对象而不是自我。在后一种情况下,当然,只有一个线程在一个时间允许执行一个类方法,因为对所有呼叫者只有一个类的对象共享。



Listing 10-1 Locking a method using self



- (void)criticalMethod


{

   

    @synchronized(self)

   

    {

       

        // Critical code.

       

        ...

       

    }

   

}



清单10-2使 用当前选择,_cmd作为互斥。这种同步是有益的只有当正在同步的方法有一个唯一的名称。这是因为没有其他对象或类将被允许执行一个具有相同名称不同的方法,直到当前方法的结束。



Listing 10-2 Locking a method using _cmd



- (void)criticalMethod


{

   

    @synchronized(NSStringFromSelector(_cmd))

   

    {

       

        // Critical code.

       

        ...

       

    }

   

}





清单10-3显示了一个普遍的做法。在关键代码执行前,得从Account类获取一个信号量,并用它来锁的关键部分。该Account类可以在 initialize 方法中创建信号量。



Listing 10-3 Locking a method using a custom semaphore



Account *account = [Account accountFromString:[accountField stringValue]];


// Get the semaphore.


id accountSemaphore = [Account semaphore];


@synchronized(accountSemaphore)


{

   

    // Critical code.

   

    ...

   

}





在Objective - C的同步功能支持递归和重载代码。在一个递归中,一个线程可以使用一个信号量几次。其他线程被阻止使用它,直到线程释 放所 有 与它获得锁,也就是说,每一个@synchronized()块正常退出或抛出一个异常。




当同步代码快@synchronized()抛出一个异常,在Objective - C的运行时捕获该异常,释放信号量(这样,受保护的 代码可以被其他线程执行), 并重新抛异常到下一个异常处理程序。
原文地址:http://www.devdiv.com/home.php?mod=space&uid=21083&do=blog&id=7409
分享到:
评论

相关推荐

    OC-@synchronized

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

    正确使用多线程同步锁@synchronized()1

    `@synchronized`关键字是Apple提供的一种简便的同步机制,它可以帮助开发者确保在多线程环境下对共享资源进行原子性操作,防止数据竞争问题。本文将深入探讨`@synchronized`的工作原理、特点以及使用时需要注意的...

    NSLock和@synchronized

    在Objective-C中,我们通常会用到两种主要的互斥锁机制:NSLock和@synchronized关键字。这两个工具都用于在多线程环境下控制对共享资源的访问,防止数据竞争和死锁等问题的发生。接下来,我们将深入探讨这两种锁的...

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

    为了解决这个问题,我们需要使用同步机制,如`synchronized`关键字。本文将深入探讨在`NSThread`中使用`synchronized`进行加锁来保证线程安全。 首先,让我们了解什么是`synchronized`关键字。`synchronized`是...

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

    已同步 将Objective-C的@synchronized指令公开给Swift。 与Objective-C指令类似,Synchronized获取一个互斥锁,运行一些代码,并在代码完成或引发异常时释放该锁。链接框架可通过获得同步。 要安装它,只需将以下行...

    Synchronized关键字的用法

    ### Synchronized关键字在Java中的应用 #### 概述 `synchronized`是Java语言中的一个关键字,主要用于实现线程同步,防止多个线程同时访问共享资源而导致的数据不一致问题。通过`synchronized`关键字,开发者可以...

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

    使用 `@synchronized` 关键字时,你需要提供一个对象作为锁的标识,确保只有当这个对象相同的锁被持有时,代码块才会被执行。在示例中,`@synchronized(cjobj)` 创建了一个基于 `cjobj` 对象的锁,两个并发的异步...

    线程锁与Nscondition

    当一个代码块被@synchronized包围时,该代码块将在一个互斥锁下执行,确保同一时间只有一个线程可以执行。例如: ```objc @synchronized(self) { // 临界区代码,此时只有当前线程可以执行 } ``` 这里的`self`...

    java中synchronized用法

    "Java 中 synchronized 用法详解" Synchronized 是 Java 语言中用于解决多线程共享数据同步问题的关键字。它可以作为函数的修饰符,也可以作为函数内的语句,用于实现同步方法和同步语句块。在 Java 中,...

    详解iOS 多线程 锁 互斥 同步

    方法一,@synchronized(id anObject),(最简单的方法) 会自动对参数对象加锁,保证临界区内的代码线程安全 @synchronized(self) { // 这段代码对其他 @synchronized(self) 都是互斥的 // self 指向同一个对象...

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

    5. **线程安全**:为了确保在多线程环境中正确地创建和访问单例,可以在`sharedInstance`方法中添加线程同步代码,如使用GCD的`dispatch_once`或者`@synchronized`关键字。 **使用GCD实现线程安全的单例** ```objc ...

    jboss seam 注解

    - **`@Synchronized`**: 在多客户端并发访问时,确保对组件请求的串行化,防止竞争条件,如`@Synchronized(timeout=1000)`。 #### 九、`@ReadOnly` - **`@ReadOnly`**: 标记组件或其方法在调用结束时无需状态复制...

    Python库 | syncing-1.0.2-py3-none-any.whl

    例如,如果"syncing"库提供了一种高效的数据同步机制,那么可能包含如`synchronized`这样的装饰器,用于确保多线程或多进程下的数据一致性。使用方式可能如下: ```python from syncing import synchronized class...

    SingletonTest Demo代码

    `@synchronized` 关键字用于锁定代码块,防止多线程同时访问,确保线程安全。但相对于`dispatch_once`,其效率稍低。 ### 3. SingletonTest Demo SingletonTest Demo通常会包含以下部分: - **Singleton类**:...

    lombok_lombok_源码.zip

    这些预处理器负责处理复杂的逻辑,例如 `@Builder` 可以生成 builder 模式代码,`@Synchronized` 会将方法封装在一个同步块中。 5. 兼容性与插件支持:Lombok 与大多数主流 IDE(如 IntelliJ IDEA 和 Eclipse)以及...

    xiancheng-tongbu-.zip_tongbu source iphone

    这可能是通过苹果的GCD(Grand Central Dispatch)、NSOperationQueue、锁(如NSLock、@synchronized关键字)、信号量(NSCondition)或者其他并发控制机制实现的。 线程同步的目标是提高多核处理器的性能,同时...

    自定义redis序列化和解决穿透问题.docx

    在可能存在并发问题的方法上使用`@Cacheable`注解,并结合`@Synchronized`注解来确保线程安全,防止多线程环境下数据同步延迟。但需要注意,`@Synchronized`会影响方法的并发性能,因此应谨慎使用。 2. **编码方式*...

    java里面synchronized用法.doc

    Java 中的 synchronized 用法详解 Java 中的 synchronized 关键字是用于解决多线程并发问题的重要工具之一。它可以被用于方法、代码块和变量上,以实现对共享资源的互斥访问控制。本文将对 Java 中的 synchronized ...

Global site tag (gtag.js) - Google Analytics