iOS 锁的常用方法
锁的用法
在iOS中有几种方法来解决多线程访问同一个内存地址的互斥同步问题:
方法一,@synchronized(id anObject),(最简单的方法)
会自动对参数对象加锁,保证临界区内的代码线程安全
@synchronized(self)
{
// 这段代码对其他 @synchronized(self) 都是互斥的
// self 指向同一个对象
}
方法二,NSLock
NSLock对象实现了NSLocking protocol,包含几个方法:
lock,加锁
unlock,解锁
tryLock,尝试加锁,如果失败了,并不会阻塞线程,只是立即返回NO
lockBeforeDate:,在指定的date之前暂时阻塞线程(如果没有获取锁的话),如果到期还没有获取锁,则线程被唤醒,函数立即返回NO
比如:
NSLock *theLock = [[NSLock alloc] init];
if ([theLock lock])
{
//do something here
[theLock unlock];
}
方法三,NSRecursiveLock,递归锁
NSRecursiveLock,多次调用不会阻塞已获取该锁的线程。
NSRecursiveLock *theLock = [[NSRecursiveLock alloc] init]; void MyRecursiveFunction(int value)
{
[theLock lock];
if (value != ){
–value;
MyRecursiveFunction(value);
}
[theLock unlock];
} MyRecursiveFunction();
方法四,NSConditionLock,条件锁
NSConditionLock,条件锁,可以设置条件
//公共部分
id condLock = [[NSConditionLock alloc] initWithCondition:NO_DATA]; //线程一,生产者
while(true) {
[condLock lockWhenCondition:NO_DATA];
//生产数据
[condLock unlockWithCondition:HAS_DATA];
} //线程二,消费者
while (true) {
[condLock lockWhenCondition:HAS_DATA];
//消费
[condLock unlockWithCondition:NO_DATA];
}
方法五,NSDistributedLock,分布锁
NSDistributedLock,分布锁,文件方式实现,可以跨进程
用tryLock方法获取锁。
用unlock方法释放锁。
如果一个获取锁的进程在释放锁之前挂了,那么锁就一直得不到释放了,此时可以通过breakLock强行获取锁。
iOS 锁的常用方法的更多相关文章
- 对iOS锁的一些研究
#import <objc/runtime.h> #import <objc/message.h> #import <libkern/OSAtomic.h> #im ...
- java 多线程: Thread 锁ReentrantLock 常用方法
注意 reentrantLock 和 同步代码块儿一样,同一个时刻只能一个线程获取锁,也就是共用锁的代码块部分,线程是顺序执行的 ReentrantLock 常用方法 getHoldCount获取当前 ...
- 苹果iOS锁屏制作
下面我们开始. 一.锁屏界面 可以观察到,iphone的锁屏界面在时间和解锁部分有着透明强高光风格的背景,高光部分有非常明显的界限,边缘部分1像素的高光也是非常醒目的,整体感觉整个表面非常光滑,如同玻 ...
- App 开发中判断 ios 和 andriod 常用方法便于修复在两类机型样式不一样等缺陷
判断安卓, ios
- iOS开发中常用方法调用顺序
- IOS学习--UIButton常用方法(20150122)
// 1.创建一个自定义的按钮 UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; // 2.添加按钮 [self.view a ...
- IOS 缩放图片常用方法
/** * 指定Size压缩图片 (图片会压缩变形) * * @param image 原图 * @param size 压缩size * * @return 压缩后的图片 */ -(UIImage* ...
- iOS UIView非常用方法及属性详解
在调用视图的 Quartz 调用都可以正确地在视图中描画. 视图对象通过 bounds .和 center 属 性声明来跟踪自己的大小和位置.frame 属性包含一个矩形,即边框矩形,用于指定 ...
- iOS开发-UITableView常用方法
UITableView常用来展示数据,类似于Android中的ListView,相对于Android中的ListView而言,UITableView的实现是非常简单,继承UITableViewData ...
随机推荐
- AutoIt中ControlFocus的使用
在使用AutoIt最控件做自动化操作的时候,经常性的会碰到无法使用Windows Info工具获取控件的属性,但是我们又需要获取该控件的焦点,我们该怎么办呢? 方法1: 应用controlFocus方 ...
- 22.java方法的定义
java中的方法:就相当于c语言中的函数:sun在开发java的时候,为提高其代码的重复利用率,引入了方法. 什么是方法? 方法就是一段代码片段,这个片段可以完成特定的功能,并且可以重复利用. 从入口 ...
- android 自动生成jni C语言头文件
1. 在类里面申明 public native xxx(); 函数接口2. 在安卓工程src目录下 使用命令 javah 包名.类名 生成该类所申明的c语言接口
- docker容器firewalld端口转发规则
docker容器firewalld端口转发规则 1.配置firewalld端口转发,要先打开端口转发,则需要先 #firewall-cmd --zone=public --add-maspuerade ...
- iOS项目上线的流程
基本知识 首先要了解一下Xcode打包签名机制中 Certificates & Identificates &Provisioning Profiles 三者之间的关系: Certif ...
- [翻译] 物理引擎javascript实现
转自: How Physics Engines Work 高中物理全还给老师了啊啊啊啊啊啊 牛顿第二定律 物体加速度的大小跟物体受到的作用力成正比,跟物体的质量成反比,加速度的方向跟合外力的方向相同. ...
- 5、overflow、hover
一.overflow 1.属性介绍 说明: 这个属性定义溢出元素内容区的内容会如何处理.如果值为 scroll,不论是否需要,用户代理都会提供一种滚动机制.因此,有可能即使元素框中可以放下所有内容也会 ...
- APOSE.Cell导入图片
一:读取EXcel单元格图片 1:读取全部单元格的图片集合 worksheet.pictureCollotion 2:遍历pictureCollotion (foreach (var pic ...
- flex设置默认字体为微软雅黑
必须使用英文名称 Microsoft YaHei 否则有些系统不识别
- HDU1010 Tempter of the Bone【小狗是否能逃生----DFS奇偶剪枝(t时刻恰好到达)】
Tempter of the Bone Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u ...