Swift - 锁

NSLock

public struct Cache {
    
    private static var data = [String:Any]()
    
//    private static var lock = DispatchSemaphore(value: 1)
    private static var lock = NSLock()
    
    public static func get(_ key:String) -> Any? {
        
        data[key]
        
    }
    
    public static func set(_ key:String,_ value:Any) {
        
        lock.lock()
        
        defer {
            lock.unlock()
        }
        data[key] = value
        
    }
}

NSRecursiveLock

递归锁

public struct Cache {
    
    private static var data = [String:Any]()
    
//    private static var lock = DispatchSemaphore(value: 1)
//    private static var lock = NSLock()
    private static var lock = NSRecursiveLock()
    
    public static func get(_ key:String) -> Any? {
        
        data[key]
        
    }
    
    public static func set(_ key:String,_ value:Any) {
        
        lock.lock()
        
        defer {
            lock.unlock()
        }
        data[key] = value
        
    }
}

当发生自己调用自己的时候,或者递归的时候,需要使用递归锁NSRecursiveLock,用法跟NSLock是一样的,只是使用场景可能不一样。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文为L_Ares个人写作,以任何形式转载请表明原文出处。 锁,在多线程的编程中,经常出场的人物,本文只是自己对锁...
    L_Ares阅读 651评论 0 2
  • 前言 iOS开发中由于各种第三方库的高度封装,对锁的使用很少,刚好之前面试中被问到的关于并发编程锁的问题,都是一知...
    KingWorld阅读 1,111评论 0 0
  • 自旋锁和互斥锁 共同点:都能保证同一时刻只能有一个线程操作锁住的代码。都能保证线程安全。不同点: 互斥锁(mute...
    中轴线_lz阅读 754评论 0 0
  • 前言 iOS开发中由于各种第三方库的高度封装,对锁的使用很少,刚好之前面试中被问到的关于并发编程锁的问题,都是一知...
    iOS__开发者皮皮峰阅读 591评论 1 5
  • 在平时的开发中经常使用到多线程,在使用多线程的过程中,难免会遇到资源竞争的问题,那我们怎么来避免出现这种问题那? ...
    IAMCJ阅读 3,155评论 2 25