@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()抛出一个异常,在Objecti

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
@synchronized是Objective-C中用于实现线程安全的关键字。它可以用于保护一段代码,确保同一时间只有一个线程可以执行这段代码。当你传入一个对象给@synchronized时,这个对象会与一个递归锁关联起来。递归锁是一种特殊的锁,它允许同一个线程多次对它进行加锁,而不会造成死锁。 在实现中,每个被@synchronized保护的对象都会有一个与之关联的递归锁。这个递归锁会在代码块执行之前被加锁,然后在代码块执行完毕后被解锁。这样可以确保同一时间只有一个线程可以执行被@synchronized保护的代码块。 当你传入的对象在@synchronized的代码块中被释放或者赋值为nil时,递归锁会继续保持对这个对象的引用。这是因为递归锁会在加锁时对对象进行retain操作,而在解锁时对对象进行release操作。所以即使对象被释放或者赋值为nil,递归锁仍然可以正常工作。 引用\[2\]和引用\[3\]提供了一些关于@synchronized实现的细节。在底层,使用了一个结构体SyncList来管理被@synchronized保护的对象和对应的递归锁。每个SyncList结构体都有一个指向SyncData节点链表头部的指针,以及一个用于防止多个线程对列表做并发修改的锁。SyncData结构体包含了被@synchronized保护的对象和与之关联的递归锁。每个SyncData对象也包含一个指向另一个SyncData对象的指针,形成了一个链表结构。通过这种方式,可以实现对不同对象的并发保护。 总结起来,@synchronized关键字通过与递归锁关联来实现线程安全。传入的对象会与一个递归锁关联起来,递归锁会在代码块执行前加锁,在代码块执行完毕后解锁。即使对象被释放或者赋值为nil,递归锁仍然可以正常工作。通过使用SyncList和SyncData结构体,可以管理多个被@synchronized保护的对象和对应的递归锁。 #### 引用[.reference_title] - *1* *2* *3* [@synchronized 递归锁详解](https://blog.csdn.net/u014600626/article/details/107915866)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值