多线程同步加锁主要方式有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. window,getComputedStyle,letter-spacing

       js 拿到element的css样式    window.getComputedStyle(ele,[pseuso)    比如想拿到一个element的背景色 window.getComput ...

  2. LeetCode解题报告—— Bus Routes

    We have a list of bus routes. Each routes[i] is a bus route that the i-th bus repeats forever. For e ...

  3. 遇见Python.h: No such file or directory的解决方法

    出现No such file or directory的错误,有两种情况,一种是没有Python.h这个文件,一种是Python的版本不对, 可以进入/usr/include/文件夹下的Pythonx ...

  4. 前端读者 | 如何判断Javascript对象是否存在

    本文来自@阮一峰 Javascript语言的设计不够严谨,很多地方一不小心就会出错. 举例来说,请考虑以下情况. 现在,我们要判断一个全局对象myObj是否存在,如果不存在,就对它进行声明.用自然语言 ...

  5. TCP握手协议简述

    TCP握手协议简述在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接.第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器 ...

  6. centos xampp 隐藏phpmyadmin地址

    /opt/lampp/etc/extra/httpd-xampp.conf Alias /phpmyadmin "/opt/xampp/phpMyAdmin/" 改为 Alias ...

  7. asp.net mvc 中使用NPOI导出excel

    版本信息:NPOI1.2.5(2.0以上的版本很多方法不清楚) 明确三点: path: mvc 部署网站的时候,我们肯定要拷贝的一个文件夹就mvc的UI层,有点可以肯定的是,你部署网站的路径不一定都是 ...

  8. No module named '_Sqlite3' 解决方法

    今晚,在学习Python的时候,(学习链接:http://yidao620c.github.io/blog/20150420/simpleblog-01.html(搭载自己的博客案例)): 想为系统生 ...

  9. Python3 文件操作基本语法

    对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 f = open('lyrics') #打开文件 first_line = f.readline() prin ...

  10. DOS中的CD命令详解

    CD命令是改变子目录的命令.格式:CD [路径] . 值得明确的是:CD命令只能进入当前盘符中的文件夹,改变操作的根目录(改变操作盘符),则不需用cd.例如你当前是在c:盘下,要到d:盘,只需键入d: ...