Realm重复实例化是否复用缓存实例?多线程场景疑问
我开发了一个用Realm做数据持久化的Swift & SwiftUI应用,代码里每次访问数据库都会实例化新的Realm实例,示例代码如下:
final class RealmDataManager { init() {} func getAccounts() -> Results<Account> { let realm = try! Realm() return realm.objects(Account.self) } func addAccount(account: Account) { let realm = try! Realm() realm.add(account) } }
根据Realm文档说明:
Like any disk I/O operation, creating a Realm instance could sometimes fail if resources are constrained. In practice, this can only happen the first time a Realm instance is created on a given thread. Subsequent accesses to a Realm from the same thread will reuse a cached instance and will always succeed.
我的疑问:即便每次都创建新的Realm实例,同一线程下Realm是否会在后台复用缓存实例?还是每次实例化Realm()都会创建独立的非缓存实例?当前写法是否会因未复用缓存影响性能,或是Realm会自动处理缓存?
补充背景:我的应用需要在主线程和后台线程调用RealmDataManager,因此还想确认:
- 在不同线程创建新Realm实例是否不会复用缓存实例?
- 是否需要持有Realm实例以避免访问失败?(但单实例会引发多线程问题)
核心疑问解答
同一线程下,每次调用try! Realm()不会创建独立实例,Realm会自动复用该线程的缓存实例。
Realm的线程内缓存机制就是为了优化这种场景:第一次在某线程初始化Realm时会执行磁盘IO操作,后续在该线程的所有Realm()调用都会直接返回缓存的实例,完全不需要担心重复实例化带来的性能损耗,你的当前写法不会有性能问题,Realm已经自动处理了缓存逻辑。
补充问题解答
- 不同线程的Realm缓存是完全隔离的,不会跨线程复用缓存实例。每个线程都有自己独立的Realm实例缓存,这是Realm多线程模型的核心设计——Realm实例、对象、
Results结果集都不允许跨线程传递。 - 不需要持有全局单例Realm实例,反而会引发多线程安全问题:
- 如文档所述,只有首次在某线程创建Realm实例时存在失败可能,后续调用都是复用缓存且必然成功。建议替换
try!为do-catch逻辑,捕获首次初始化可能出现的异常。 - 如果要在某线程内多次执行数据库操作,也可以选择在该线程内持有一个Realm实例复用,但这并非必须——因为即使每次调用
Realm(),底层也是复用缓存,性能上没有差异,只是代码风格的选择。
- 如文档所述,只有首次在某线程创建Realm实例时存在失败可能,后续调用都是复用缓存且必然成功。建议替换
内容的提问来源于stack exchange,提问作者Yuuu

