使用线程安全协助可以防御副本吗?

时间:2014-02-18 09:43:23

标签: java thread-safety defensive-copy

在此示例中是否需要使用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方法之前修改fileName。调用String.valueOf(fileName)之前是不是一样?

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

2 个答案:

答案 0 :(得分:3)

在Java中,字符串是不可变的,并且另一个线程无法修改fileName引用的值(因为它是调用方法的本地值),所以防御性副本这里绝对没有任何好处。

一般而言,防御性副本可以帮助避免此类情况,前提是在正确的时间完成(当副本正在运行时没有其他线程可以修改实例)。正如这个String示例所示,更好的防御思想是使传递的类不可变。

答案 1 :(得分:1)

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