Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字符串数组是线程安全的吗?_Java_Multithreading - Fatal编程技术网

Java 字符串数组是线程安全的吗?

Java 字符串数组是线程安全的吗?,java,multithreading,Java,Multithreading,bookTokens在下面的代码中是线程安全的吗?我不太确定字符串数组的值是否可以以线程安全的方式读取 public Class Myclass{ private static final String[] bookTokens = { "amazon", "manning", "book"}; public static void methodOne(){ //read values from bookTokens } public static

bookTokens在下面的代码中是线程安全的吗?我不太确定字符串数组的值是否可以以线程安全的方式读取

public Class Myclass{

    private static final String[] bookTokens = { "amazon", "manning", "book"};

    public static void methodOne(){
    //read values from bookTokens
    }


    public static void methodTwo(){
    //read values from bookTokens
    }

}

通常,数组不是线程安全的

然而,在本例中,我们有一个不会被更新的数组,它的初始化方式确保了与随后读取它的任何线程的正确同步


因此,在这种情况下,代码是线程安全的。

如果您可以确保Myclass中没有执行以下等效操作的代码,则此代码是线程安全的:

    public static void mutateBookTokens() {
        bookTokens[2] = "addison-wesley";
    }

任何只读取值而不更改任何内容的代码本质上都是线程安全的,因为它使用的数据是不可变的。

String是不可变的,因此它们是线程安全的,但StringBuilderArray不是不可变的。但是如果你只是阅读,而不是写作,那么它是线程安全的。这不是这个问题的重复。例如,另一个问题中的例子涉及到数组的变异。我本来会使用Guava的不可变列表,但如果上述代码本质上是线程安全的,我不想过度使用。请参阅Brian Goetz等人的《Java并发性实践》,第3.5节。(安全出版物)和第3.5.4节(有效不可变对象)。程序从不修改的技术上可变的对象(例如,上面示例中的数组)称为有效不可变。当对象安全发布时,使用有效的不可变对象是线程安全的。示例中的数组是安全发布的,因为它是通过发布的。完全初始化后的
final
字段。+1表示有效的不可变对象引用。谢谢“…并以确保正确同步的方式初始化…”是的。有关更详细的解释,请参见我对eitanfar的回应,见下文。