美文网首页
如何实现同步机制?

如何实现同步机制?

作者: CharmecarWang | 来源:发表于2018-11-02 18:26 被阅读0次

实现同步机制目前知道有3中方法,分别是@synchronized、NSLock、GCD。

@synchronized

@synchronized:它会根据指定的对象,自动创建一个锁,并等待块中的代码执行完毕,锁就释放了。

- (NSString *)someString {
   @synchronized(self) {
      return _someString;
  }
}

- (void)setSomeString:(NSString *)someString {
    @synchronized(self) {
        _someString = someString;
    }
}

缺点:滥用@synchronized会危险,因为所有同步块都会彼此抢夺一个锁,要是很多个属性能这么写的话,那么每个属性的同步块都要等其他所有同步块执行完毕才能执行,这会大大降低代码的执行效率。

NSLock

_lock = [[NSLock alloc] init];

- (void)sychronizedMethod {
    [_lock lock];
    //Safe
    [_lock unlock];
}

缺点:极端情况下,同步块会导致死锁。而且NSLock效率也不是很高。

GCD

它能以更简单,更高效的形式为代码加锁。

1.使用串行同步队列来代替同步块或锁对象

_syncQueue = dispatch_queue_create("com.effectiveobject.syncQueue", NULL);

- (NSString)someString {
    __block NSString *localSomeString;
    dispatch_sync(_syncQueue, ^{
        localSomeString = _someString;
    });
    return localSomeString;
}

- (void)setSomeString:(NSString *)someString {
    dispatch_sync(_syncQueue, ^{
        _someString = someString;
})
}

我们都知道,串行同步队列即任务按顺序执行,并且不回开辟新的线程,使读取操作与写入操作都安排在同一个队列里,即可保证数据同步。

2.使用串行异步队列来代替同步块或锁对象

_syncQueue = dispatch_queue_create("com.effectiveobject.syncQueue", NULL);

- (NSString)someString {
    __block NSString *localSomeString;
    dispatch_sync(_syncQueue, ^{
        localSomeString = _someString;
    });
    return localSomeString;
}

- (void)setSomeString:(NSString *)someString {
    dispatch_async(_syncQueue, ^{
        _someString = someString;
})
}

这是把设置方法改成了异步。因为是串行队列,读取操作与写入操作依然会按顺序执行。

3.并发队列+dispatch_barrier_async

_syncQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

- (NSString)someString {
    __block NSString *localSomeString;
    dispatch_sync(_syncQueue, ^{
        localSomeString = _someString;
    });
    return localSomeString;
}

- (void)setSomeString:(NSString *)someString {
    dispatch_barrier_async(_syncQueue, ^{
        _someString = someString;
})
}

dispatch_barrier_async能够使之前加入并发队列的块先执行完,再单独执行栅栏块,待栅栏块执行过后,再按正常方式向下处理。

本例中,使用栅栏块来实现属性的设置方法,来保证读取操作可以并发执行,但是写入操作是单独执行的。

相关文章

  • 深入理解synchronized关键字

    synchronized是如何实现同步的 synchronized 是 Java 中的关键字,是利用锁的机制来实现...

  • 如何实现同步机制?

    实现同步机制目前知道有3中方法,分别是@synchronized、NSLock、GCD。 @synchronize...

  • 线程同步辅助类(一)

    java中基本的同步机制有synchronized,Lock等,这些机制可以实现并发任务共享一个资源时的同步...

  • Nacos常用配置

    上一篇 <<<数据同步机制(如何实现日志的复制)[https://www.jianshu.com/p/340e8b...

  • 多线程笔记:同步机制(1)

    同步机制简介 线程同步机制是一套用于协调线程间的数据访问及活动的机制,该机制用于保障线程安全以及实现这些线程的共同...

  • RocketMQ-HA机制(主从同步)-修正版

    初识主从同步 主从同步基本实现过程如下图所示: RocketMQ 的主从同步机制如下: A. 首先启动Master...

  • 2018-05-11 JAVA

    1 java同步几种方法?threadlocal怎么实现。 java的同步机制 1.synchronized; 2...

  • ReentrantLock原理分析

    前言 上一篇文章《基于CAS操作的Java非阻塞同步机制》 分析了非同步阻塞机制的实现原理,本篇将分析一种以非同步...

  • Lock锁 与 synchronized 比较

    Lock 定义:更强大的线程同步机制--显式定义同步锁对象来实现同步 特点: 在JUC(java.util.con...

  • Java性能 -- CAS乐观锁

    synchronized / Lock / CAS synchronized和Lock实现的同步锁机制,都属于悲观...

网友评论

      本文标题:如何实现同步机制?

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