如何在Java多线程环境中复制ArrayList <T>?

伊利亚·斯玛金(Ilya Smagin)

在线程A中,ArrayList创建了一个。它仅从线程A进行管理。在线程B中,我想将其复制到新实例。

要求是不copyList应该失败,并且应该返回列表的一致版本(至少在复制过程中有时存在=)。

我的方法是这样的:

public static <T> ArrayList<T> copyList(ArrayList<? extends T> list) {
    List<? extends T> unmodifiableList = Collections.unmodifiableList(list);
    return new ArrayList<T>(unmodifiableList);
}

问题1:是否满足要求?

问题2:如何在没有Collections.unmodifiableList适当的迭代器和try-catch块的情况下执行相同的操作

UPD。那是我一年前被问到的面试问题。我理解在多线程环境中使用非线程安全的集合(例如ArrayList)是一个坏主意

杜兰达

如果“拥有”线程不提供某种协议来创建ArrayList的副本,绝对没有办法

如果没有任何协议,线程A可以在可能修改的列表的任何时间,这意味着线程B从来没有得到一个机会,以确保是看到了列表的一致状态。

为了实际允许进行一致的复制,线程A必须确保对其所做的任何修改都将写入内存,并且对其他线程可见。

通常,如果执行程序的线程内部没有差异,则允许VM重新排列指令,进行适当的读写操作。例如,这包括通过将值保存在CPU寄存器或本地堆栈中来延迟写入。

确保所有内容始终写入主菜单的唯一方法是使线程A执行对VM提出重新排序障碍的指令(例如,同步块或易失性字段访问)。

因此,如果没有线程A的合作,就无法确保满足上述条件。

规避此问题的常见方法是仅通过以安全包装的形式使用List来同步对List的访问(Collections.synchronizedCollection),或者使用内置了这些保证的List实现(任何类型的并发list实现)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

TJson.JsonToObject <T>在多线程环境中引发错误

来自分类Dev

如何在多线程环境中更好地使用ExecutorService?

来自分类Dev

scanf(),std :: cin在多线程环境中的行为如何?

来自分类Dev

如何在HTML中复制\ t制表符空间?

来自分类Dev

如何在iOS中执行多线程?

来自分类Dev

c-如何在多线程环境中处理SIGPIPE?

来自分类Dev

多线程如何在Web环境中工作

来自分类Dev

多线程环境中的Java Singleton类行为

来自分类Dev

Java仅用于2台计算机的多线程,如何在主线程中执行

来自分类Dev

在多线程环境中如何在服务堆栈中正确使用Redis?

来自分类Dev

MQ C API-如何在多线程环境中中止正在等待的`MQGET`

来自分类Dev

如何在多线程环境中正确使用EasyNetQ

来自分类Dev

多线程:如何在不同的线程中运行不同的功能?

来自分类Dev

如何在Python中实现多线程?

来自分类Dev

多线程环境中的Java回调函数

来自分类Dev

OBJ-C如何在多线程环境中为C ++单身添加锁?

来自分类Dev

如何在多线程环境中使用Servlet

来自分类Dev

Java中的多线程

来自分类Dev

如何在Perl中开始多线程

来自分类Dev

多线程如何在Web环境中工作

来自分类Dev

如何在多线程JAVA环境中保护对象而又不损失性能?

来自分类Dev

Java仅用于2台计算机的多线程,如何在主线程中执行

来自分类Dev

如何在多线程Java中插入数据库

来自分类Dev

(Java多线程)如何在多线程中传递参数?

来自分类Dev

如何在多线程环境中使用序列

来自分类Dev

多线程环境中的Java CRC32计算

来自分类Dev

如何在多线程应用程序中存储线程

来自分类Dev

如何在 Java 中使用多线程和 ArrayList

来自分类Dev

如何在多线程环境中搜索特定的字符串表单列表。?

Related 相关文章

  1. 1

    TJson.JsonToObject <T>在多线程环境中引发错误

  2. 2

    如何在多线程环境中更好地使用ExecutorService?

  3. 3

    scanf(),std :: cin在多线程环境中的行为如何?

  4. 4

    如何在HTML中复制\ t制表符空间?

  5. 5

    如何在iOS中执行多线程?

  6. 6

    c-如何在多线程环境中处理SIGPIPE?

  7. 7

    多线程如何在Web环境中工作

  8. 8

    多线程环境中的Java Singleton类行为

  9. 9

    Java仅用于2台计算机的多线程,如何在主线程中执行

  10. 10

    在多线程环境中如何在服务堆栈中正确使用Redis?

  11. 11

    MQ C API-如何在多线程环境中中止正在等待的`MQGET`

  12. 12

    如何在多线程环境中正确使用EasyNetQ

  13. 13

    多线程:如何在不同的线程中运行不同的功能?

  14. 14

    如何在Python中实现多线程?

  15. 15

    多线程环境中的Java回调函数

  16. 16

    OBJ-C如何在多线程环境中为C ++单身添加锁?

  17. 17

    如何在多线程环境中使用Servlet

  18. 18

    Java中的多线程

  19. 19

    如何在Perl中开始多线程

  20. 20

    多线程如何在Web环境中工作

  21. 21

    如何在多线程JAVA环境中保护对象而又不损失性能?

  22. 22

    Java仅用于2台计算机的多线程,如何在主线程中执行

  23. 23

    如何在多线程Java中插入数据库

  24. 24

    (Java多线程)如何在多线程中传递参数?

  25. 25

    如何在多线程环境中使用序列

  26. 26

    多线程环境中的Java CRC32计算

  27. 27

    如何在多线程应用程序中存储线程

  28. 28

    如何在 Java 中使用多线程和 ArrayList

  29. 29

    如何在多线程环境中搜索特定的字符串表单列表。?

热门标签

归档