锁的用法
在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 锁的常用方法的更多相关文章

  1. 对iOS锁的一些研究

    #import <objc/runtime.h> #import <objc/message.h> #import <libkern/OSAtomic.h> #im ...

  2. java 多线程: Thread 锁ReentrantLock 常用方法

    注意 reentrantLock 和 同步代码块儿一样,同一个时刻只能一个线程获取锁,也就是共用锁的代码块部分,线程是顺序执行的 ReentrantLock 常用方法 getHoldCount获取当前 ...

  3. 苹果iOS锁屏制作

    下面我们开始. 一.锁屏界面 可以观察到,iphone的锁屏界面在时间和解锁部分有着透明强高光风格的背景,高光部分有非常明显的界限,边缘部分1像素的高光也是非常醒目的,整体感觉整个表面非常光滑,如同玻 ...

  4. App 开发中判断 ios 和 andriod 常用方法便于修复在两类机型样式不一样等缺陷

    判断安卓, ios

  5. iOS开发中常用方法调用顺序

  6. IOS学习--UIButton常用方法(20150122)

    // 1.创建一个自定义的按钮 UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; // 2.添加按钮 [self.view a ...

  7. IOS 缩放图片常用方法

    /** * 指定Size压缩图片 (图片会压缩变形) * * @param image 原图 * @param size 压缩size * * @return 压缩后的图片 */ -(UIImage* ...

  8. iOS UIView非常用方法及属性详解

    在调用视图的 Quartz  调用都可以正确地在视图中描画.   视图对象通过 bounds .和 center  属 性声明来跟踪自己的大小和位置.frame 属性包含一个矩形,即边框矩形,用于指定 ...

  9. iOS开发-UITableView常用方法

    UITableView常用来展示数据,类似于Android中的ListView,相对于Android中的ListView而言,UITableView的实现是非常简单,继承UITableViewData ...

随机推荐

  1. AutoIt中ControlFocus的使用

    在使用AutoIt最控件做自动化操作的时候,经常性的会碰到无法使用Windows Info工具获取控件的属性,但是我们又需要获取该控件的焦点,我们该怎么办呢? 方法1: 应用controlFocus方 ...

  2. 22.java方法的定义

    java中的方法:就相当于c语言中的函数:sun在开发java的时候,为提高其代码的重复利用率,引入了方法. 什么是方法? 方法就是一段代码片段,这个片段可以完成特定的功能,并且可以重复利用. 从入口 ...

  3. android 自动生成jni C语言头文件

    1. 在类里面申明 public native xxx(); 函数接口2. 在安卓工程src目录下 使用命令 javah 包名.类名 生成该类所申明的c语言接口

  4. docker容器firewalld端口转发规则

    docker容器firewalld端口转发规则 1.配置firewalld端口转发,要先打开端口转发,则需要先 #firewall-cmd --zone=public --add-maspuerade ...

  5. iOS项目上线的流程

    基本知识 首先要了解一下Xcode打包签名机制中 Certificates & Identificates &Provisioning Profiles 三者之间的关系: Certif ...

  6. [翻译] 物理引擎javascript实现

    转自: How Physics Engines Work 高中物理全还给老师了啊啊啊啊啊啊 牛顿第二定律 物体加速度的大小跟物体受到的作用力成正比,跟物体的质量成反比,加速度的方向跟合外力的方向相同. ...

  7. 5、overflow、hover

    一.overflow 1.属性介绍 说明: 这个属性定义溢出元素内容区的内容会如何处理.如果值为 scroll,不论是否需要,用户代理都会提供一种滚动机制.因此,有可能即使元素框中可以放下所有内容也会 ...

  8. APOSE.Cell导入图片

    一:读取EXcel单元格图片 1:读取全部单元格的图片集合  worksheet.pictureCollotion 2:遍历pictureCollotion    (foreach (var  pic ...

  9. flex设置默认字体为微软雅黑

    必须使用英文名称 Microsoft YaHei 否则有些系统不识别

  10. HDU1010 Tempter of the Bone【小狗是否能逃生----DFS奇偶剪枝(t时刻恰好到达)】

    Tempter of the Bone Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u ...