美文网首页
利用dispatch_barrier_async设置读写锁

利用dispatch_barrier_async设置读写锁

作者: 杯子西瓜 | 来源:发表于2017-10-17 11:36 被阅读0次

利用dispatch_barrier_async方法,可以对一个值设置读写锁,使读写过程线程安全。主要是限制“写”,保证每次“写”的时候是线程安全的。

特点:
必须要一个自定义并行队列,在栅栏中的任务,会等待在它之前加入到队列的任务都完成,才会执行;在他之后加入队列的任务,也会等它完成后才执行。

用法:
1. 栅栏必须要在自定义的并行队列中才能生效,所以得自己先创建一个并行队列。

- (dispatch_queue_t)queue{
    
    if (!_queue) {
        _queue = dispatch_queue_create("my_lock", DISPATCH_QUEUE_CONCURRENT);
    }

    return _queue;
}
  1. 在set方法里加栅栏,利用栅栏将赋值任务加入自定义队列,这样就保证在执行赋值的时候线程是安全的。
- (void)setCountFlag:(NSInteger)countFlag{
    
    dispatch_barrier_async(self.queue, ^{
        _countFlag = countFlag;
        
    });
    
}

3.在get获取值的时候,也将取值任务放入自定义并行队列

 - (NSInteger)countFlag
{
    __block NSInteger tempCountFlag;
    dispatch_sync(self.queue, ^{
        tempCountFlag = self.countFlag;
    });
    return tempCountFlag;
}

这样的话,所有对于countFlag读取操作的任务都在自定义的并行队列中,且在每次修改countFlag后,再去读取countFlag的值一定是修改后正确的值。之所以取值时用同步操作,是因为我们明确返回一个值后才去执行下面方法。并且self.queue队列中,并没有存在会阻塞线程的长时间操作。

相关文章

  • 利用dispatch_barrier_async设置读写锁

    利用dispatch_barrier_async方法,可以对一个值设置读写锁,使读写过程线程安全。主要是限制“写”...

  • GCD 实例用法

    读写锁 读写锁的特点: 可以多方同时读 写是互斥的 新读取的东西必须是写后的 我们可以利用queue中barrie...

  • go RWMutex源码解析

    RWMutex 基于go 1.13源码总的来说读写锁就是利用互斥锁和CAS维护2个关于读锁的变量以及runtime...

  • 读写锁和互斥锁 读写互斥锁,简称读写锁 mux sync.RWMutex Lock和Unlock分别对写锁进行锁定...

  • 线程同步(下)

    继上篇。这篇介绍的几种使用的较少。 读写锁 读写锁与互斥锁类似。不过读写锁允许更高的并行性。读写锁可以有三种状态:...

  • 可重入读写锁 ReentrantReadWriteLock

    读写锁分为读锁和写锁,多个线程获取读锁不互斥,读写锁、写写锁互斥。 输出

  • Java并发编程-读写锁(ReentrantReadWriteL

    章节目录 ReentrantReadWriteLock 特性 读写锁接口示例 读写锁的实现分析读写状态设计写锁的释...

  • 线程安全之读写锁

    相关API 初始化读写锁 释放读写锁 获取读锁 获取写锁 解锁 实例

  • ReadWriteLock读写锁

    1、引入ReadWriteLock读写锁 ReadWriteLock是JDK5中提供的读写分离锁。读写分离锁可以有...

  • 基于CAS的一些锁(5)- ReadWriteLock

    ReadWriteLock 读写锁。读写锁的概念其实就是共享锁和排他锁,读锁就是共享锁,写锁就是排他锁。 如何理解...

网友评论

      本文标题:利用dispatch_barrier_async设置读写锁

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