线程锁关键字@synchronized

static Config * instance =nil;

+(Config *) Instance {

    @synchronized(self)  {

        if(nil == instance)  {

            [self new];

        }

    }

    returninstance;

}


+(id)allocWithZone:(NSZone *)zone {

    @synchronized(self)  {

        if(instance ==nil){

            instance = [superallocWithZone:zone];

            return instance;

        }

    }

    return nil;

}

在上面两个例子中都用到 关键字@synchronized,这里大概说一下

  @synchronized,代表这个方法加锁, 相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程例如B正在用这个方法,有的话要等正在使用synchronized方法的线程B运行完这个方法后再运行此线程A,没有的话,直接运行。它包括两种用法:synchronized 方法和 synchronized 块。

@synchronized 方法控制对类(一般在IOS中用在单例中)的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法锁方能执行,否则所属就会发生线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类,至多只有一个处于可执行状态,从而有效避免了类成员变量的访问冲突(只要所有可能访问类的方法均被声明为 synchronized)。

synchronized 块:

  @通过 synchronized关键字 来声明synchronized 块。语法如下:
  @synchronized(syncObject) {  }
  synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行,具体机制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。
  • 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、付费专栏及课程。

余额充值