美文网首页
编写高质量iOS与OS X代码的52个有效方法--第41条

编写高质量iOS与OS X代码的52个有效方法--第41条

作者: 8fe8946fa366 | 来源:发表于2018-04-01 14:22 被阅读5次

    第41条:多用派发队列,少用同步锁

    1.错误的线程安全的存取方法

    -(NSString*)someString{

        @synchronized(self){ return _someString;}

    }

    通过同步块synchronized来设计存取方法是不正确的,所有同步块都要去抢夺同一个锁,如果每个属性都这样写的话,那个每个属性的同步块都要等其它属性的同步块执行完了才能执行,这样效率很低。而且这样也不能做到真正的线程安全,在同一个线程上多次调用getter方法,得到的值可能是不同的,因为在两次方法的执行期间可能有其它线程执行了setter操作。

    2.用gcd实现线程安全的存取方法

    思路:把gcd的存取操作都放到同一个队列中执行,那么在这个队列只要保证了存取方法的线程安全,就保证了整个线程的安全。

    为了加快效率,我们发现多个读取方法可以并发执行,但是写入操作必须单独执行。因此我们可以开启一个并发队列,同时用栅栏函数,在并发队列里,栅栏块必须单独执行,不能和其它任务块并行。

    getter方法

    -(NSString*)someString{

        __block NSString* localSomeString;

        [dispatch_sync(dispatch_get_global_queue(0, 0), ^{

            localSomeString = _someString;

        })];

        return localSomeString;

    }

    setter方法

    -(void)setSomeString:(NSString*)someString{

        dispatch_barrier_async(dispatch_get_global_queue(0, 0), ^{

            _someString = someString;

        });

    }

    相关文章

      网友评论

          本文标题:编写高质量iOS与OS X代码的52个有效方法--第41条

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