Java 静态final char[]是线程安全的吗?

Java 静态final char[]是线程安全的吗?,java,multithreading,Java,Multithreading,所以如果我有 private static final char[] SOME_CHARS; 那个线安全吗?我的意思是,如果我有多个线程引用该数组中的字符(但不更改它们),是否会出错 e、 g 私有类someThread扩展Thread(){ 公开募捐{ for(int i=0;i只要数组类型的赋值是原子的(除了double和long以外的任何情况都是如此),则为true。没有问题。String是一种确定的不可变数据类型,因此更安全。即使更改字符也可以。我已将标题调整为关闭到代码-char[]

所以如果我有

private static final char[] SOME_CHARS;
那个线安全吗?我的意思是,如果我有多个线程引用该数组中的字符(但不更改它们),是否会出错

e、 g

私有类someThread扩展Thread(){
公开募捐{
for(int i=0;i

换句话说,我是否需要将char[]放入某种支持线程的Java集合中?

如果在初始化后不更改它们,就可以了。(请注意,这取决于它是一个
静态final
变量-初始化类的方式将确保所有线程正确地看到初始化的数组引用。)


从多个线程读取数组是安全的。如果您不介意看到过时的结果,甚至可以从多个线程写入,这样就不会“损坏”集合本身。(与许多其他集合不同,您无论如何都不能更改数组的大小……除了元素本身之外,没有其他状态可修改。)

hmm如果我把字符放进一个字符串中会怎么样?所以String=“something”+SOME_CHARS[I]”然后在某个点返回字符串?我不认为这是一个问题,因为新字符串应该有一个新字符,而不是对旧字符的引用-是这样吗?@praks5432:没关系。不清楚你的意思是什么这里的“新字符”和“旧字符”……别忘了,
char
无论如何都是一种原始类型……嗯,所以我想我是在问这个问题——如果我用从该数组中相同索引得到的相同字符做不同的事情,那么我能保证数组不会改变吗?@praks5432:是的。你只是在使用值——除非你有
SOMECHARS[i] =…
那么您就不会更改数组中的值。“如果您不介意看到陈旧的结果,您甚至可以从多个线程进行写入”=>只要数组类型的赋值是原子的(除了double和long以外的任何情况都是如此),则为true。没有问题。
String
是一种确定的不可变数据类型,因此更安全。即使更改字符也可以。我已将标题调整为关闭到代码-
char[]
而不是
char[]
。我想这才是你真正的意思?是的-很抱歉,这是一个打字错误-我会在标题中添加final。如果你只在静态final字符数组填充后读取它,并且不再更改它,线程安全是一个额外的功能。只有当你从不同的线程更改数组中的值时,你才会考虑这个问题d安全性。虽然不变性通常并不意味着线程安全,但它有很大帮助;)请注意,您“可以”更改final char[]变量的内容。您不能更改该变量所持有的引用。即final禁止“variable=…”,但您仍然可以执行“variable[i]=…”。
private class someThread extends Thread(){


   public void run(){
     for(int i = 0; i < someIndexInSomeChars;i++){
        System.out.println(SOME_CHARS[i]);
     }
}