You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift 6中如何创建并发安全的引用类型单例?

正确解决CLI日志单例并发安全的Swift官方方案

针对你遇到的OutputCoordinator单例并发安全问题,Swift官方推荐以下两种合规实现方式,既满足日志顺序要求,又符合Sendable协议规范,无需使用@unchecked Sendable:

方式一:利用Actor实现串行化日志处理

Actor是Swift并发模型中专门用于处理共享可变状态的原生机制,天然保证串行执行,完美契合日志顺序需求:

// 定义全局Actor(适用于需要多个组件共享同一串行上下文的场景)
@globalActor
final actor OutputActor: GlobalActor {
    static let shared = OutputActor()
}

// 让OutputCoordinator归属于全局Actor
@OutputActor
final class OutputCoordinator {
    static let shared = OutputCoordinator()
    private init() {}
    
    func log(_ message: String) {
        // 所有log调用会自动在OutputActor的串行队列中执行,保证顺序
        print(message)
    }
}

// 调用方式(CLI中可在Task中同步等待,或在异步上下文直接调用)
Task {
    await OutputCoordinator.shared.log("日志内容")
}

如果不需要全局Actor,也可以直接让OutputCoordinator本身是Actor类型:

actor OutputCoordinator {
    static let shared = OutputCoordinator()
    private init() {}
    
    func log(_ message: String) {
        print(message)
    }
}

// 调用方式
Task {
    await OutputCoordinator.shared.log("日志内容")
}

Actor会自动将所有方法调用串行化,确保日志输出顺序与调用顺序完全一致,同时编译器会自动验证其Sendable合规性,无需额外标记。

方式二:基于DispatchQueue的传统串行化方案

如果你的CLI工具以同步代码为主,不想引入异步调用,可以使用DispatchQueue的同步执行机制,同时让类安全遵循Sendable:

final class OutputCoordinator: Sendable {
    static let shared = OutputCoordinator()
    // 创建专属串行队列,保证所有日志操作串行执行
    private let processingQueue = DispatchQueue(label: "com.yourcli.output-coordinator")
    
    private init() {}
    
    func log(_ message: String) {
        // 使用sync保证当前线程等待日志处理完成,同时确保顺序
        processingQueue.sync {
            print(message)
        }
    }
}

// 调用方式(同步直接调用)
OutputCoordinator.shared.log("日志内容")

这里processingQueue是不可变属性,类的所有成员都是Sendable兼容的,因此编译器可以直接验证类符合Sendable协议,无需手动添加@unchecked。

为什么不推荐@unchecked Sendable

@unchecked Sendable是绕过编译器并发安全检查的手段,官方仅建议在你能完全手动保证所有共享状态的线程安全时使用。对于日志单例这种场景,使用Actor或DispatchQueue的原生机制,既能保证正确性,又能让编译器帮你验证合规性,避免潜在的并发Bug。

内容的提问来源于stack exchange,提问作者Ky -

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 19:18:12