美文网首页多线程
多线程同步加锁

多线程同步加锁

作者: 择一城终老_蜗牛 | 来源:发表于2017-07-05 10:44 被阅读66次

https://blog.csdn.net/deft_mkjing/article/details/79513500详细介绍锁相关内容

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

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

区别:

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

协议如下:

@protocol NSLocking

- (void)lock;      //加锁

- (void)unlock;  //解锁

@end

详解介绍NSLock:-------------普通锁

<1>属性:@property (copy) NSString *name //锁的名字

<2>其他方法:

    - (BOOL)tryLock;                                  //尝试加锁(有可能已经被其他线程加锁)

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

详解介绍NSCondition:---------状态锁

<1>属性:@property (copy) NSString *name //锁的名字

<2>其他方法:

      - (void)wait;                                          //睡眠等待解锁

    - (BOOL)waitUntilDate:(NSDate *)limit;    //定时等待解锁

    - (void)signal;                                        //加锁信号

    - (void)broadcast;                                  //解锁通知

详解介绍NSRecursiveLock:------ 递归锁

<1>属性:@property (copy) NSString *name //锁的名字

<2>其他方法:

    - (BOOL)tryLock;                                  //尝试加锁(有可能已经被其他线程加锁,此时无法在加锁)

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

详解介绍NSConditionLock:------条件锁

<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多线程

    多线程技术 Thread 给线程加锁使线程同步 Operation

  • 多线程同步加锁

    https://blog.csdn.net/deft_mkjing/article/details/7951350...

  • 4.多线程基础(四) 线程的状态,安全性

    1.线程的状态 2.多线程的安全隐患 3.多线程的同步问题 //没有加锁之前 //加锁之后: 下面不是唯一的: 4...

  • 多线程(4) — 同步互斥与通信

    多线程问题:比如银行转账等问题 synchronized:"同步 = 加锁 ":含有synchronized关键字...

  • volatile

    在多线程中,同步关键字synchronized 加锁的对象是在 对象. 如果要 类 级别加锁,要给该类加上fi...

  • java解决多线程安全的方式

    解决多线程安全问题的方式(加锁)包含以下几种: synchronized关键字:又包含同步代码块,同步方法 Loc...

  • iOS 多线程同步,线程加锁

    思考1、项目中怎么确保数据安全 我们在写代码的时候可能很少人会去特别注意这些细节的东西,在项目中我碰到过好几次这样...

  • 多线程之volatile

    volatile Synchronized 同步锁给多个线程访问的代码块加锁以保证线程安全性。多线程之Synchr...

  • 分布式锁

    1、锁: 单进程的系统中,存在多线程同时操作一个公共变量,此时需要加锁对变量进行同步操作,保证多线程的操作线性执行...

  • iOS多线程 线程同步 如何加锁

    本文代码 demo地址 一、 常见的多线程方案 GCD中的一些常见函数 术语 队列及线程使用 二、 线程同步(加锁...

网友评论

    本文标题:多线程同步加锁

    本文链接:https://www.haomeiwen.com/subject/nsmbqxtx.html