美文网首页iOS小记程序员iOS 开发
大牛们是如何构建一个线程安全的字典的!

大牛们是如何构建一个线程安全的字典的!

作者: 刘书亚的天堂之路 | 来源:发表于2016-05-24 11:24 被阅读1070次
    /**
     线程安全的字典
     */
    @interface OSSSyncMutableDictionary : NSObject
    @property (nonatomic, strong) NSMutableDictionary *dictionary;
    @property (nonatomic, strong) dispatch_queue_t dispatchQueue;
    
    - (id)objectForKey:(id)aKey;
    - (NSArray *)allKeys;
    - (void)setObject:(id)anObject forKey:(id <NSCopying>)aKey;
    - (void)removeObjectForKey:(id)aKey;
    @end
    
    @implementation OSSSyncMutableDictionary
    
    - (instancetype)init {
        if (self = [super init]) {
            _dictionary = [NSMutableDictionary new];
            _dispatchQueue = dispatch_queue_create("com.aliyun.aliyunsycmutabledictionary", DISPATCH_QUEUE_SERIAL);
        }
    
        return self;
    }
    
    - (NSArray *)allKeys {
        __block NSArray *allKeys = nil;
        dispatch_sync(self.dispatchQueue, ^{
            allKeys = [self.dictionary allKeys];
        });
        return allKeys;
    }
    
    - (id)objectForKey:(id)aKey {
        __block id returnObject = nil;
    
        dispatch_sync(self.dispatchQueue, ^{
            returnObject = [self.dictionary objectForKey:aKey];
        });
    
        return returnObject;
    }
    
    - (void)setObject:(id)anObject forKey:(id <NSCopying>)aKey {
        dispatch_sync(self.dispatchQueue, ^{
            [self.dictionary setObject:anObject forKey:aKey];
        });
    }
    
    - (void)removeObjectForKey:(id)aKey {
        dispatch_sync(self.dispatchQueue, ^{
            [self.dictionary removeObjectForKey:aKey];
        });
    }
    
    @end
    
    

    看不懂的话,请留言我!!!

    相关文章

      网友评论

      • LD_左岸:大神这么写什么意思:
        @property (nonatomic, strong) dispatch_queue_t sessionQueue;

        - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
        { //+++<OS_dispatch_queue: session queue[0x1741702c0]>+++
        NSLog(@"+++%@+++",[self sessionQueue]);
        dispatch_async([self sessionQueue], ^{
        NSLog(@"666");
        });
        }
        我这么写会崩 如果我传入主队列 和全局并发队列是可以的 但是我直接调用属性的get方法不成
        LD_左岸:打印出来的[self sessionQueue]是null
      • 75542c3a4dad:同时创建需要queue应该是存在性能损耗的
        75542c3a4dad:@阿里学院 感觉不如 读写锁,之前写过,实测基本读写性能是gcd的3倍。但是担心有坑
        刘书亚的天堂之路:很小的这种
      • 处处闻笛鸟花落知多少谁知:是阿里内部的做法?
      • 9a996ce6ed8d:能不能用线程锁呢,自己创建队列感觉有点繁琐
        刘书亚的天堂之路: @blackforever 可以的,不过不推荐,GCD效率更好
        布丿Ding:+1,我也想知道
      • afander:你好,我怎么觉得这样的字典实质上还是不安全的,你把dictionary暴露在外面,在外面是可以被线程调用的,这样,是不是就不是原子操作了
        afander:@Michael520 私有的,那几个方法如何调用?
        刘书亚的天堂之路: @Michael520 嗯,是的
        szmichael:他这个dictonary应该是在私有的吧,并没有放到.h文件中。只在.m文件中吧
      • afander:怎么不把dispatch_sync改为dispatch_async呢
        9a996ce6ed8d:为了保证线程安全,肯定是要用同步不能用异步啊,相当于@synchronized
      • for_in:会影响效率吗?
        刘书亚的天堂之路:@上车再说 不会的 放心
      • 王梓舟:这是不是需要在字典中加入太多数据才应运而生的?
        王梓舟:@阿里海瑟要 原来是这样 懂了:+1:
        刘书亚的天堂之路: @王梓舟 主要是需要并发频繁操作字典的情况下,类似于上锁

      本文标题:大牛们是如何构建一个线程安全的字典的!

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