多线程同步加锁主要方式有3种:NSLock(普通锁)、NSCondition(状态锁)、synchronized同步代码块

还有少用的NSRecursiveLock(递归锁)、NSConditionLock(条件锁)、NSDistributedLock(分布锁)。

 
区别:
NSLock和NSCondition都实现<NSLocking>协议;而synchronized(锁){….}采用同步加锁的方式实现加锁,只要锁是唯一的就可以,一般设置锁为当前对象或者类名。NSLock和NSCondition是显式加锁,synchronized同步代码块是隐式加锁。
 
协议如下:

@protocol NSLocking
- (void)lock;      //加锁
- (void)unlock;  //解锁

 @end
 
详解介绍NSLock:<NSLocking>-------------普通锁
<1>属性:@property (copy) NSString *name //锁的名字
<2>其他方法:
     - (BOOL)tryLock;                                   //尝试加锁(有可能已经被其他线程加锁)

- (BOOL)lockBeforeDate:(NSDate *)limit;    //定时加锁

     
详解介绍NSCondition:<NSLocking>---------状态锁
<1>属性:@property (copy) NSString *name //锁的名字
<2>其他方法:

- (void)wait;                                          //睡眠等待解锁
     - (BOOL)waitUntilDate:(NSDate *)limit;     //定时等待解锁
     - (void)signal;                                         //加锁信号

     - (void)broadcast;                                   //解锁通知
 
详解介绍NSRecursiveLock:<NSLocking>------ 递归锁
<1>属性:@property (copy) NSString *name //锁的名字
<2>其他方法:
     - (BOOL)tryLock;                                   //尝试加锁(有可能已经被其他线程加锁,此时无法在加锁)

- (BOOL)lockBeforeDate:(NSDate *)limit;    //定时加锁

详解介绍NSConditionLock:<NSLocking>------条件锁
<1>属性:@property (copy) NSString *name             //锁的名字
               @property (readonly) NSInteger condition; //状态
<2>其他方法:
     - (BOOL)tryLock;                                        //尝试加锁(有可能已经被其他线程加锁)

- (BOOL)lockBeforeDate:(NSDate *)limit;         //定时加锁

- (instancetype)initWithCondition:(NSInteger)condition  //初始化

- (void)lockWhenCondition:(NSInteger)condition;          //加锁

- (BOOL)tryLockWhenCondition:(NSInteger)condition;   //尝试解锁

- (void)unlockWithCondition:(NSInteger)condition;        //解锁

- (BOOL)lockWhenCondition:(NSInteger)condition beforeDate:(NSDate *)limit;   //定时加锁

 
具体使用简单演示:
1、NSLock的使用:
 
    第一步:创建锁对象  
               NSLock *mylock = [[NSLock alloc]init];
while(true)
{
    第二步:将共享抢占资源加锁
              [mylock lock];
              {..........对共享抢占资源进行操作的代码..........} 
    第三步:操作完数据,马上释放锁,给其他的线程调用操作
              [mylock unlock];
    ....................
}
 
 
2、NSCondition和NSRecursiveLock的使用与NSLock基本一样,只不过NSRecursiveLock会反复调用罢了,这里介绍NSCondition即可。
 
    第一步:创建锁对象  
               NSCondition *mylock = [[NSCondition alloc]init];
while(true)
{
    第二步:将共享抢占资源加锁 
              [mylock lock];
              {..........对共享抢占资源进行操作的代码..........} 
    第三步:操作完数据,马上释放锁,给其他的线程调用操作
              [mylock unlock];
   ....................
}
 
 
3、synchronized同步代码块的使用:
             将共享抢占资源和执行代码放入其中即可
while(true)
{
       @synchronized(self)
       {..........对共享抢占资源进行操作的代码..........}
       ....................
}
说明:
 
 
4、条件锁NSConditionLock的使用:
    第一步:设置条件(初始化)
             NSConditionLock *conLock = [[NSConditionLock alloc] initWithCondition:No_Data];
    第二步:对线程一加锁解锁(生产者)
             while(true)
            {
                 [conLock lockWhenCondition:No_Data]; //加锁
                 {..........对共享抢占资源进行操作的代码..........}
                 [conLock unlockWhenCondition:Has_Data]; //解锁,此时的条件Condition设为了内部的某一个数据,可以自定义设定
            }
    第三步:对线程二加锁解锁(消费者)
            while(true)

            {
                 [conLock lockWhenCondition:Has_Data]; //加锁
                 {..........对共享抢占资源进行操作的代码..........}
                 [conLock unlockWhenCondition:No_Data]; //解锁
            }
 
 
 5、分布锁NSDistributedLock的使用
NSDistributedLock,分布锁,文件方式实现,可以跨进程
用tryLock方法获取锁。
用unlock方法释放锁。
如果一个获取锁的进程在释放锁之前挂了,那么锁就一直得不到释放了,此时可以通过breakLock强行获取锁。

iOS:多线程同步加锁的简单介绍的更多相关文章

  1. iOS多线程篇:NSThread简单介绍和使用

    一.什么是NSThread NSThread是基于线程使用,轻量级的多线程编程方法(相对GCD和NSOperation),一个NSThread对象代表一个线程, 需要手动管理线程的生命周期,处理线程同 ...

  2. iOS开发数据库篇—FMDB简单介绍

    iOS开发数据库篇—FMDB简单介绍 一.简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来 ...

  3. iOS开发UI篇—UITabBarController简单介绍

    iOS开发UI篇—UITabBarController简单介绍 一.简单介绍 UITabBarController和UINavigationController类似,UITabBarControlle ...

  4. iOS开发UI篇—Modal简单介绍

    iOS开发UI篇—Modal简单介绍 一.简单介绍 除了push之外,还有另外一种控制器的切换方式,那就是Modal 任何控制器都能通过Modal的形式展⽰出来 Modal的默认效果:新控制器从屏幕的 ...

  5. iOS开发数据库篇—SQLite简单介绍

    iOS开发数据库篇—SQLite简单介绍 一.离线缓存 在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等. 说明:离线缓存一般都是把数据保存到项目的沙盒中.有以下几种方式 (1 ...

  6. iOS开发UI篇—Kvc简单介绍

    ios开发UI篇—Kvc简单介绍 一.KVC简单介绍 KVC key valued coding 键值编码 KVC通过键值间接编码 补充: 与KVC相对的时KVO,即key valued observ ...

  7. iOS开发UI篇—UIWindow简单介绍

    iOS开发UI篇—UIWindow简单介绍 一.简单介绍 UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow iOS程序启动完毕后,创建的第一个视图控件就是UIWi ...

  8. iOS开发UI篇—Quartz2D简单介绍

    iOS开发UI篇—Quartz2D简单介绍 一.什么是Quartz2D Quartz 2D是⼀个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作: 绘制图形 : 线条\三角形\ ...

  9. iOS开发拓展篇—UIDynamic(简单介绍)

    iOS开发拓展篇—UIDynamic(简单介绍) 一.简单介绍 1.什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟 ...

随机推荐

  1. java字节码指令列表(转)

    字节码 助记符 指令含义 0x00 nop 什么都不做 0x01 aconst_null 将null推送至栈顶 0x02 iconst_m1 将int型-1推送至栈顶 0x03 iconst_0 将i ...

  2. AC日记——[ZJOI2015]幻想乡战略游戏 洛谷 P3345

    [ZJOI2015]幻想乡战略游戏 思路: 树剖暴力转移: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1 ...

  3. 解决ssh登录过慢问题

    1.首先打开debug,看看慢在哪里 [root@BC-NFS1 ~]# ssh -v root@192.168.102.41 -p 22 OpenSSH_6.6.1, OpenSSL 1.0.1e- ...

  4. gcc、make、makefile、cmake、cmakelists区别

      文章来源:见下!   作者:辉常哥链接:https://www.zhihu.com/question/36609459/answer/89743845来源:知乎著作权归作者所有.商业转载请联系作者 ...

  5. SSM整合所需jar包

    MySql驱动包 mysql-connector-java-5.1.7-bin.jar MyBatis的核心包和依赖包 mybatis-3.2.7.jar(核心包)asm-3.3.1.jar(依赖包) ...

  6. Why Did the Cow Cross the Road III(树状数组)

    Why Did the Cow Cross the Road III 时间限制: 1 Sec  内存限制: 128 MB提交: 65  解决: 28[提交][状态][讨论版] 题目描述 The lay ...

  7. Flask实战第52天:cms添加轮播图前端代码逻辑完成

    首页我们在模态框中的保存按钮加一个id,这样方便我们选取这个按钮 <button type="button" class="btn btn-primary" ...

  8. sql 常见错误

    notFound = 1403L; .dupKey = -1L; openCloseErr = -2117L; cursorNotOpenErr = -1002L; .nullCursor = -14 ...

  9. 解决cordova命令行方式下build或者run的时候报错问题

    phonegap3.0之后就将项目的生成方式做了很大的更改,原来是在eclipse里面修改生成并编译运行,但是3.0之后它的目录结构发生了很大变化,只修改主目录下面的index.html如果不buil ...

  10. 「LGR-049」洛谷7月月赛 D.Beautiful Pair

    「LGR-049」洛谷7月月赛 D.Beautiful Pair 题目大意 : 给出长度为 \(n\) 的序列,求满足 \(i \leq j\) 且 $a_i \times a_j \leq \max ...