【发布时间】:2018-07-15 04:34:32
【问题描述】:
在我的课堂上,我正在加载一些文件,为了提高效率,我想创建一个线程安全的缓存。我在地图类中看到有一个putIfAbsent 方法,但它不接受async 类型。也不确定这种结构是否可以安全使用。
这是我想要做的风格:
final Map<String, String> _cache = new Map();
Future<String> parse(final String name) async {
_cache.putIfAbsent(name, () async { // this async is not allowed
return await new File(name).readAsString();
});
return _cache[name];
}
因为我可以在参数上使用异步,所以我选择使用锁,但这会使代码更加冗长..
final Lock _lock = new Lock();
final Map<String, String> _cache = new Map();
Future<String> parse(final String name) async {
if (!_cache.containsKey(name)) {
await _lock.synchronized(() async {
if (!_cache.containsKey(name)) {
_cache[name] = await new File(name).readAsString();
}
});
}
return _cache[name];
}
有谁知道我可以如何简化这段代码,或者是否有更好的库可以用于线程安全缓存?
【问题讨论】:
标签: dictionary caching concurrency dart thread-safety