美文网首页iOS开发
iOS自定义对象的读写怎么保证线程安全

iOS自定义对象的读写怎么保证线程安全

作者: Eddiegooo | 来源:发表于2018-03-28 16:45 被阅读8次

需求:这个对象有很多属性,时时刻刻读取和写入,并且保证线程安全

方案:用栏栅dispatch_barrier_async,重写get 和setter 方法。

<一>什么是dispatch_barrier_async函数
毫无疑问,dispatch_barrier_async函数的作用与barrier的意思相同,在进程管理中起到一个栅栏的作用,它等待所有位于barrier函数之前的操作执行完毕后执行,并且在barrier函数执行之后,barrier函数之后的操作才会得到执行,该函数需要同dispatch_queue_create函数生成的concurrent Dispatch Queue队列一起使用。
<二>dispatch_barrier_async函数的作用
1.实现高效率的数据库访问和文件访问;
2.避免数据竞争。
<三>栅栏函数中传入的参数队列必须是由 dispatch_queue_create 方法创建的队列,否则,与dispatch_async无异,起不到“栅栏”的作用了,对于dispatch_barrier_sync也是同理。

测试代码:

- (void)testQueue {
//串行队列 参数:DISPATCH_QUEUE_CONCURRENT 并行队列:DISPATCH_QUEUE_SERIAL
    dispatch_queue_t queue = dispatch_queue_create("com.gcd.barrier.concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_sync(queue, ^{
        sleep(3);
        NSLog(@"3333");
    });
    
    dispatch_sync(queue, ^{
        sleep(1);
        NSLog(@"1111");
    });
    
    dispatch_barrier_async(queue, ^{
        NSLog(@"Barrier async");
    });
    
    dispatch_sync(queue, ^{
        [NSThread sleepForTimeInterval:2];
        NSLog(@"44444");
    });
}
输出结果: 打印结果.png
实现代码:
dispatch_queue_t _modelDataQ =dispatch_queue_create("somedesccriptions", DISPATCH_QUEUE_CONCURRENT);

//同步读取(一次一次读,读完才可以写入)
- (feekBackModel *)model{
    __block feekBackModel *models;
    dispatch_sync(_modelDateQ, ^{
        NSLog(@"getter ----------------");
        models = [_model mutableCopy];
    });
    return models;
}

//异步写入(在前面的读取工作完成后,多个同时写)
- (void)setModel:(feekBackModel *)model{
        dispatch_barrier_async(_modelDateQ, ^{
             NSLog(@"setter ++++++++++++");
            _model = [model mutableCopy];
        });
}

关键是调用的时候:要修改model属性的值,不能直接用self.model属性,这样直接调用的get方法。要先采用get方法,拷贝一个对象出来,然后修改该对象的属性值,再把该对象直接赋值给拷贝前的对象,这样才可以调用setter。

@synthesize delegates = _delegates;

- (NSMutableArray *)delegates{
    
    __block NSMutableArray *delegates;
    dispatch_sync(_flyDataQueue, ^{
        delegates = [_delegates mutableCopy];
    });
    
    return delegates;
}

- (void)setdelegates:(NSMutableArray *)delegates {
    dispatch_barrier_async(_flyDataQueue, ^{
        _delegates = [delegates mutableCopy];
    });
}

以后你调用的这个数组都是线程安全的

数组的读写安全也可以采用上面的方法.
添加元素和删除元素或读取元素都是加锁的。
同步读取,异步添加,读取的时候数组不能添加元素。
数组添加元素可以多任务执行但这个是时候是上锁了的,不能读取。

参考文章:GCD

相关文章

  • iOS自定义对象的读写怎么保证线程安全

    需求:这个对象有很多属性,时时刻刻读取和写入,并且保证线程安全 方案:用栏栅dispatch_barrier_as...

  • 面试总结

    1、数组和链表的区别和联系,他们是线程安全的吗 2、怎么保证线程安全: 线程安全的本质:当多个线程访问一个对象时,...

  • iOS 线程锁,多线程加锁,附DEMO!

    ios 线程锁 为什么要有线程锁,一般情况下我们是不允许多个线程同时读写操作的,为了保证线程安全,我们必须让一个线...

  • 四十二、多线程之(六)线程安全--锁(读写锁)

    iOS中的读写安全方案 1.pthread_rwlock (线程读写锁) 2.dispatch_barrier_...

  • iOS 各种锁

    概述 iOS多线程开发,会出现数据竞争,因此需要锁来保证线程安全。 线程安全 当一个线程访问资源时,需要保证其它的...

  • java多线程控制:synchronized

    在java中,如果开启多个线程同时读写一个对象,会导致数据不正常。为了保证数据的安全,我们会使用锁来控制线程的访问...

  • DispatchThread线程

    pika使用的是多线程模型,使用多个工作线程来进行读写操作,由底层blackwidow引擎来保证线程安全,线程分为...

  • 2020-09-16

    2020年iOS面试 记录一下自己遇到的面试题 百度: 1.atomic是不是线程安全的?怎么保证线程安全? 2....

  • IOS多线程安全(线程锁)

    线程安全 线程的不安全是由于多线程访问和修改共享资源而引起的不可预测的结果。ios多线程开发中为保证线程的安全常用...

  • 问题:使用atomic一定是线程安全的吗?

    atomic不是绝对的线程安全。atomic的本意是指属性的存取方法是线程安全的,并不保证整个对象是线程安全的。 ...

网友评论

    本文标题:iOS自定义对象的读写怎么保证线程安全

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