【问题标题】:How to access an array thread safely in Java?如何在 Java 中安全地访问数组线程?
【发布时间】:2015-05-23 02:06:08
【问题描述】:

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

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

【问题讨论】:

标签: java multithreading arraylist thread-safety


【解决方案1】:

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】:

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

    【讨论】:

      【解决方案3】:

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

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

      或者干脆使用

      java.util.concurrent.*
      

      【讨论】:

        猜你喜欢
        • 2019-11-23
        • 2020-06-20
        • 1970-01-01
        • 2018-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-23
        相关资源
        最近更新 更多