iOS:多线程同步加锁的简单介绍

简介:

多线程同步加锁主要方式有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高级

本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/4857470.html,如需转载请自行联系原作者
相关文章
|
28天前
|
安全 Java 编译器
线程安全问题和锁
本文详细介绍了线程的状态及其转换,包括新建、就绪、等待、超时等待、阻塞和终止状态,并通过示例说明了各状态的特点。接着,文章深入探讨了线程安全问题,分析了多线程环境下变量修改引发的数据异常,并通过使用 `synchronized` 关键字和 `volatile` 解决内存可见性问题。最后,文章讲解了锁的概念,包括同步代码块、同步方法以及 `Lock` 接口,并讨论了死锁现象及其产生的原因与解决方案。
56 10
线程安全问题和锁
|
8天前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
22 2
|
2月前
|
Java 开发者 C++
Java多线程同步大揭秘:synchronized与Lock的终极对决!
Java多线程同步大揭秘:synchronized与Lock的终极对决!
59 5
|
23天前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
【Java面试题汇总】多线程、JUC、锁篇(2023版)
|
24天前
|
API Android开发 iOS开发
安卓与iOS开发中的线程管理对比
【9月更文挑战第12天】在移动应用的世界中,安卓和iOS平台各自拥有庞大的用户群体。开发者们在这两个平台上构建应用时,线程管理是他们必须面对的关键挑战之一。本文将深入探讨两大平台在线程管理方面的异同,通过直观的代码示例,揭示它们各自的设计理念和实现方式,帮助读者更好地理解如何在安卓与iOS开发中高效地处理多线程任务。
|
12天前
|
存储 算法 Java
关于python3的一些理解(装饰器、垃圾回收、进程线程协程、全局解释器锁等)
该文章深入探讨了Python3中的多个重要概念,包括装饰器的工作原理、垃圾回收机制、进程与线程的区别及全局解释器锁(GIL)的影响等,并提供了详细的解释与示例代码。
15 0
|
2月前
|
安全 Java 开发者
Java多线程同步:synchronized与Lock的“爱恨情仇”!
Java多线程同步:synchronized与Lock的“爱恨情仇”!
81 5
|
2月前
|
Java 程序员
从0到1,手把手教你玩转Java多线程同步!
从0到1,手把手教你玩转Java多线程同步!
24 3
|
2月前
|
Java 测试技术
Java多线程同步实战:从synchronized到Lock的进化之路!
Java多线程同步实战:从synchronized到Lock的进化之路!
88 1
|
1月前
|
安全 Java API
Java线程池原理与锁机制分析
综上所述,Java线程池和锁机制是并发编程中极其重要的两个部分。线程池主要用于管理线程的生命周期和执行并发任务,而锁机制则用于保障线程安全和防止数据的并发错误。它们深入地结合在一起,成为Java高效并发编程实践中的关键要素。
19 0