如何在 Java 中安全地访问数组线程?

How to access an array thread safely in Java?

在 Java 线程中对数组的操作是否安全?

如果不是,如何确保在 Java 中访问数组线程对于读取和写入都是安全的?

java 中的数组操作不是线程安全的。相反,您可以使用 ArrayListCollections.synchronizedList()

假设我们正在尝试填充同步的字符串 ArrayList。然后你可以将项目添加到列表中 -

List<String> list = 
         Collections.synchronizedList(new ArrayList<String>());

       //Adding elements to synchronized ArrayList
       list.add("Item1");
       list.add("Item2");
       list.add("Item3"); 

然后像这样从 synchronized 块访问它们 -

synchronized(list) {
       Iterator<String> iterator = list.iterator(); 
       while (iterator.hasNext())
       System.out.println(iterator.next());
}  

或者您可以使用 ArrayList 的线程安全变体 - CopyOnWriteArrayList. A good example can be found here

希望对您有所帮助。

使用多线程更改数组时不会出现无效状态。但是,如果某个线程编辑了数组中的值,则无法保证另一个线程会看到更改。非易失性变量也会出现类似问题。

数组操作不是线程安全的。您可以锁定一个字段,我建议添加一个字段,例如命名为 LOCK 并执行

void add(){
 syncronized(LOCK) {
  // add
 }
}

void get(int i){
 synchronized(LOCK){ 
   // return
 }
}

或简单地使用

java.util.concurrent.*