【问题标题】:Adding to ArrayList from separate thread从单独的线程添加到 ArrayList
【发布时间】:2016-04-10 20:04:59
【问题描述】:

我有一个有 3 个线程的程序(不包括主线程)。第一个线程在窗口中移动一个对象,第二个线程检查对象冲突,第三个线程应该定期添加到对象的 ArrayList 中。所有这三个线程都在操作相同的对象列表(虽然前两个实际上并没有改变列表,只是里面的对象)。但是,当要添加到列表的线程尝试添加对象时,我收到错误消息。是否可以从不同的线程操作 ArrayList?

【问题讨论】:

    标签: java multithreading arraylist thread-safety


    【解决方案1】:

    您可以通过将操作数组列表的代码放在synchronized(arrayList) { ... } 块中来防止竞争条件。

    【讨论】:

      【解决方案2】:

      ArrayList 没有什么特别之处,它可以防止它被多个线程读取和写入。但是,请注意warning in the Javadoc

      请注意,此实现不同步。如果多个线程同时访问一个 ArrayList 实例,并且至少有一个线程在结构上修改了列表,则必须在外部进行同步。 (结构修改是添加或删除一个或多个元素,或显式调整后备数组大小的任何操作;仅设置元素的值不是结构修改。)这通常通过同步一些自然封装的对象来完成列表。如果不存在这样的对象,则应使用 Collections.synchronizedList 方法“包装”该列表。这最好在创建时完成,以防止意外不同步地访问列表:

      List list = Collections.synchronizedList(new ArrayList(...));
      

      Synchronization Tutorial也值得一读。

      【讨论】:

        【解决方案3】:

        是的,您可以在多个线程中处理数组。您可以在Java documentation 中阅读更多关于将synchronized 关键字用于对象的信息。

        【讨论】:

          【解决方案4】:

          首先,如果您有一个多线程应用程序...最好使用 Vector 而不是 ArrayList,因为 ArrayList 不被认为是线程安全的。

          另外,为了处理并发, 您可以使用 synchronized 方法并对其执行操作,或者使用 synchronized 块。

          【讨论】:

          • Java 无法识别synchronised——它必须拼写为synchronized
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-22
          • 1970-01-01
          • 2015-03-10
          • 1970-01-01
          • 1970-01-01
          • 2012-03-14
          相关资源
          最近更新 更多