【问题标题】:Can defensive copies by used the assist with thread-safety?防御性副本可以使用线程安全辅助吗?
【发布时间】:2014-02-18 09:43:23
【问题描述】:

在此示例中是否需要对 fileName 参数进行防御性复制?

public static Context getInstanceFromFile(final String fileName) 
throws IOException, FileNotFoundException, ContextException {
    if (fileName == null) {
        throw new NullPointerException("The fileName argument is null.");
    }
    return instance.loadParametersFromFile(String.valueOf(fileName));
}

理论上,另一个线程可以在调用loadParametersFromFile 方法之前修改文件名。在调用String.valueOf(fileName) 之前不是这样吗?

当调用 loadParametersFromFile 时,如何确保在 fileName 中传递的值仍然相同?

【问题讨论】:

  • 修改String?不,这是不可能的,不需要复制任何东西。

标签: java thread-safety defensive-copy


【解决方案1】:

在 Java 中,字符串是不可变的,其他线程无法修改您的 fileName 引用的值(因为它是调用方法的本地),因此防御性副本绝对不会带来任何好处。

一般来说,防御性副本可以帮助避免这种情况,只要在正确的时间完成(当副本运行时没有其他线程可以修改实例)。正如String 示例所说明的,一个更好的防御方法是使传递的类不可变。

【讨论】:

    【解决方案2】:

    不,在 Java 中,字符串是不可变的(除非您使用反射来破解它)。无需安全复制它。

    【讨论】:

      猜你喜欢
      • 2014-06-24
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 2011-09-16
      • 2019-04-09
      相关资源
      最近更新 更多