public struct Cache {
private static var data = [String:Any]()
private static var lock = DispatchSemaphore(value: 1)
public static func get(_ key:String) -> Any? {
data[key]
}
public static func set(_ key:String,_ value:Any) {
lock.wait()
defer {
lock.signal()
}
data[key] = value
}
}
创建了一个信号量DispatchSemaphore(value: 1),一次只能执行一次,在需要上锁的地方lock.wait(),一般来说,在事情做完之后,需要解锁的,lock.signal(),但是为了安全起见,data[key] = value这个可能赋值失败,如果lock.signal()写在data[key] = value之后,可能就无法执行了,所以使用defer更安全
网友评论