Java 同步 - 这个简单的方法需要它吗?

标签 java synchronization methods

我有一个从多个线程调用的简单方法;

@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/

相关文章:

Java - 使用递归用其他列表作为函数参数填充列表值

java - 如何对 SWT 表中的列进行分组?

java - Android xml 文件突然显示 java 代码。

java - 当我们在方法内创建锁(同步块(synchronized block))对象时会发生什么?

java - 如何从另一个 .jar 中的类调用方法?

javascript - 单独适用于页面上多个元素的方法

java - 优化 BerkeleyDB JE 数据库

collections - Backbone.js - "Syncing"集合之间的模型

wpf - 是否可以使用 WPF 在多台计算机之间同步视频?

ruby - 如何使用 splat 作为 ruby​​ 方法参数