多线程同步加锁主要方式有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. Flask 的系统学习

    详细看地址: http://www.cnblogs.com/wupeiqi/articles/7552008.html 一. 说明 Flask是一个基于Python开发并且依赖jinja2模板和Wer ...

  2. 关于Sphinx中使用 RealTime Index的问题

    我们有了完整索引和增量索引,为什么还需要研究实时索引? 1.完整索引每个晚上空闲时执行一次,时间较长,但问题不大,因为IO慢,CPU累,但那个时间段基本没有人使用平台,比如凌晨2点. 2.增量索引:目 ...

  3. hdu5823

    官方题解:直接状压dp就行了,f[S]表示点集S的色数,枚举子集转移(子集是独立集).这样是3^n的. 这样就可以过了……(独立集就是点互相没有连边) 学到了一个穷举子集的简便写法 for (int ...

  4. bootstrap中如何多次使用一个摸态框

    /**弹出框设置**/ function showjcziimodal(url, width) { $("#jczii-modal").remove();//如果存在此Id的Mod ...

  5. 关于render函数的总结

    一般情况下封装一个导航组件的写法 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  6. 字典树&01字典树算法笔记

    1]学习了字典树之后,觉得它很明显的就是用空间来换时间,空间复杂度特别大,比如字典数单单存26个小写字母,那么每个节点的孩子节点都有26个孩子节点,字典树中的每一层都保留着不同单词的相同字母. 2]0 ...

  7. NBUT 1218 You are my brother

    $dfs$. 记录一下每一个节点的深度就可以了. #include<cstdio> #include<cstring> #include<cmath> #inclu ...

  8. Bzoj4753/洛谷P4432 [JSOI2016]最佳团体(0/1分数规划+树形DP)

    题面 Bzoj 洛谷 题解 这种求比值最大就是\(0/1\)分数规划的一般模型. 这里用二分法来求解最大比值,接着考虑如何\(check\),这里很明显可以想到用树形背包\(check\),但是时间复 ...

  9. Eclipse line number

  10. linux shell date 用当天时间做备份文件名

    #!/bin/bash #date  显示时间,我们可以用时间的不同做为备份文件的名字,这样以前的备份就不会被覆盖 datename=$(date +%Y%m%d-%H%M%S)           ...