我有一个从多个线程调用的简单方法;
@Override
public Bitmap getFullBitmap(Filter f, ProgressCallback<String> pc) {
// Requires synchronisation?
Bitmap bitmap = fullMap.get(f.id);
if(bitmap == null){
f.setProgressCallback(pc);
bitmap = f.e.evaluate(currentBitmap);
fullMap.put(f.id, bitmap);
}
return bitmap;
}
由于使用的对象都不是类的字段(除了 fullMap),是否可以只调用它,或者例如在方法执行时一个线程可能会更改 bitmap 的值?
fullMap 是一个 SoftHashMap,它维护索引的 Bitmap 对象的 SoftReferences,但用于创建它的 Filter 的 id。如果这有任何意义的话。
我没有遇到任何问题,但我想我可能需要它。
如果不清楚,请要求澄清,这个问题在我的脑海中是有意义的;)
编辑
- currentBitmap 是 Bitmap 类型的对象,系统中有一个位图被认为是当前的,并由该类管理。
- 这段代码形成了一个非常基本的缓存, 返回的位图将始终是 每个 id 都相同,但不同 在此方法之外进行修改。
- 通过在 SoftHashMap 如Dr Heinx所述和硬的 FIFO 队列 最近 10 条引用文献 补充说我希望避免昂贵的电话费 进行评估。话虽这么说, 调用 f.e.evaluate 将返回 相同的位图对象(如果是) 给定相同的输入。经过一些 认为似乎正在同步 这个方法是个好主意 两个线程的积极结果 执行此代码相同 过滤。
- 此外,我将位图设为最终的 创建后不应发生变化。
非常感谢! 伽夫
最佳答案
2 个线程可以同时访问 map fullMap
。两者都可以确定映射不包含同一键的值,每个创建一个,然后将其写回,从而插入两次键。
除了效率之外,这很可能不是一个问题。然而,它可能会造成困惑,并且随着解决方案的发展,可能会在未来引起问题(将来创建这些对象的成本有多高?如果有人将代码复制/粘贴到不合适的地方会发生什么!)
我强烈建议对上述内容进行同步(最有可能在 fullMap
本身而不是包含的对象上进行同步,但在决定确切需要什么之前,更多上下文会很有用)
关于Java 同步 - 这个简单的方法需要它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/993039/