利用ARC解决遗忘unlock的毛病

简介: 利用ARC解决遗忘unlock的毛病我们在使用lock的时候会有这样的情况:因为某方法内部逻辑较为复杂,会有很多地方return,稍不留神都会漏掉一次unlock的操作,在查看一些C++源码时发现一种比较优雅的设计,在某个方法或一个代码块需要锁时,不直接对锁进行操作,而是通过创建一个局部对象来管理这个锁,我们将这个对象称之为”哨兵”,该对象在构造函数中执行lock操作,而在析构函数中执行unlock,这样当我们需要加锁时只需要创建这个对象,当函数return后或代码块结束时,因为局部对象在超出作用域后释放,便自动完成了unlock的动作。

利用ARC解决遗忘unlock的毛病

我们在使用lock的时候会有这样的情况:因为某方法内部逻辑较为复杂,会有很多地方return,稍不留神都会漏掉一次unlock的操作,在查看一些C++源码时发现一种比较优雅的设计,在某个方法或一个代码块需要锁时,不直接对锁进行操作,而是通过创建一个局部对象来管理这个锁,我们将这个对象称之为”哨兵”,该对象在构造函数中执行lock操作,而在析构函数中执行unlock,这样当我们需要加锁时只需要创建这个对象,当函数return后或代码块结束时,因为局部对象在超出作用域后释放,便自动完成了unlock的动作。
而在Objective-C中我们不能创建局部对象,但利用ARC的特性却也可以达到超出作用域自动释放的特性。
以下是”哨兵”类的实现:

以下是我们在使用锁的时候:

目录
相关文章
|
27天前
|
Java
在Java多线程编程中,`wait()`和`notify()`方法的相遇如同一场奇妙的邂逅
在Java多线程编程中,`wait()`和`notify()`方法的相遇如同一场奇妙的邂逅。它们用于线程间通信,使线程能够协作完成任务。通过这些方法,生产者和消费者线程可以高效地管理共享资源,确保程序的有序运行。正确使用这些方法需要遵循同步规则,避免虚假唤醒等问题。示例代码展示了如何在生产者-消费者模型中使用`wait()`和`notify()`。
25 1
|
3月前
|
NoSQL Java Redis
基本锁的理解(待补充)
可重入锁允许同一线程多次获取同一锁而不致死锁;不可重入锁则不允许递归锁定,连续调用会致死锁。死锁发生在多进程争夺资源导致僵局。读锁允许多线程并发读取,写锁则排他。自旋锁通过循环等待获取锁;共享锁用于只读操作;排它锁用于数据修改;闭锁延迟线程直至状态终止;信号量控制对资源的访问,未获信号量的线程会进入睡眠状态。
|
6月前
|
并行计算 安全 开发者
避免Python多线程中的常见陷阱与错误
避免Python多线程中的常见陷阱与错误
|
关系型数据库 MySQL 索引
mysql innodb 行锁解锁后出现1213 死表现象 Deadlock found when
mysql innodb 行锁解锁后出现1213 死表现象 Deadlock found when
320 0
mysql innodb 行锁解锁后出现1213 死表现象 Deadlock found when
|
存储 安全 Java
小白也能看懂的锁升级过程和锁状态
小白也能看懂的锁升级过程和锁状态
259 0
小白也能看懂的锁升级过程和锁状态
|
程序员
【高并发】又一个朋友面试栽在了Thread类的stop()方法和interrupt()方法上!
新一轮的面试已经开始了,可能是疫情的原因吧,很多童鞋纷纷留言说今年的面试题难度又提高了,尤其是对并发编程的知识。我细想了下,也许有那么点疫情的原因吧,但无论面试的套路怎么变,只要掌握了核心知识和底层原理,吊打面试官应该不难吧。玩笑归玩笑,学习知识并不只是为了应付面试,更应该将这些知识运用到实际的工作中。
219 2
【高并发】又一个朋友面试栽在了Thread类的stop()方法和interrupt()方法上!
|
iOS开发
iOS开发:block死循环及__weak弱引用提前释放的问题解决
block死循环及__weak弱引用提前释放的问题解决
327 0
|
安全
细节是魔鬼——基于计数器的锁机制的实现准则
有点标题党了,本意是想把对内核锁机制的一些实现细节记录下来,但多少反映了锁机制实现时的一些准则。本文讨论的锁机制主要指基于计数器的锁机制例如 spinlock、mutex,不包括 RCU 这类锁机制。 ### parallesim 在讨论各种锁机制之前,有必要讨论系统的并行度,即有哪些潜在的竞争场景 1. 中断上下文与进程上下文对共享资源的访问,由于中断是异步进行的,因而中断与进程是并发执行
355 0
|
存储 Java
多线程基础篇(3)——初试锁
参考资料《Java并发编程的艺术》《Java编程思想》《Java核心技术》
1348 0
|
测试技术 开发者
还记得吗?那个曾让你头疼的Waiting For Debugger
Waiting For Debugger,开发者,你还熟悉吗?到这里卡死了。 Waiting For Debugger1.jpg 今天公司内部人员给我反馈一个问题,说我们的测试包不能用,不知道为什么。
1779 0