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

时间:2015-03-19 19:32:46

标签: java multithreading arraylist thread-safety

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

如果不是如何访问Java中安全的数组线程进行读写操作?

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

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

一起使用

假设我们正在尝试填充String的同步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。可以找到一个很好的例子here

希望它会有所帮助。

答案 2 :(得分:1)

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

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

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

或只是使用

java.util.concurrent.*