Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 同步与收集。同步列表与CopyOnWriteArrayList_Java_List_Collections - Fatal编程技术网

Java 同步与收集。同步列表与CopyOnWriteArrayList

Java 同步与收集。同步列表与CopyOnWriteArrayList,java,list,collections,Java,List,Collections,如果我的需求决定了我对列表的大多数访问都是为了阅读和修改(如果有修改的话),那么为什么我不能只做以下两项呢 同步modifyList方法并使用ArrayList。从arraylist读取的所有数据都将不同步 或 在modifyList中,执行Collections.synchronizedList(arrayList)操作 或 CopyOnWriteArrayList(不确定它在这里买了什么) 我为什么要用这两个呢?哪一个更好?另一个解决方案是使用ReentrantReadWriteLock,这

如果我的需求决定了我对列表的大多数访问都是为了阅读和修改(如果有修改的话),那么为什么我不能只做以下两项呢

  • 同步modifyList方法并使用ArrayList。从arraylist读取的所有数据都将不同步 或
  • 在modifyList中,执行Collections.synchronizedList(arrayList)操作 或
  • CopyOnWriteArrayList(不确定它在这里买了什么)

  • 我为什么要用这两个呢?哪一个更好?

    另一个解决方案是使用ReentrantReadWriteLock,这样您可以在读取操作上使用只读锁(不会阻止其他读取),在写入时使用写锁(它将阻塞直到没有读取,并且在释放之前不允许任何读取锁。

    另一种解决方案是使用ReentrantReadWriteLock,以便在读取操作上使用只读锁(不会阻塞其他读取),在写入时使用写锁(这将阻止,直到没有读取,并且在释放之前不允许任何读取锁定。

    对于1和2,我不确定您仅通过同步写入来完成什么。如果有潜在的读卡器可能正在迭代列表,或者正在按索引查找内容,则只有同步写入证明不了什么。读取ers仍能在写入过程中读取数据,可能会看到脏数据或出现异常(
    ConcurrentModification
    IndexOutOfBounds

    如果希望在其他线程进行更改时进行“安全”的迭代和获取,则需要同步读写操作。此时,您还可以使用
    向量

    CopyOnWriteArrayList
    是专门为您想做的事情而构建的。它购买了安全的无同步迭代器,同时大大增加了写入成本。它还有做您想做的事情的优势(或者从简洁的问题来看,您想做什么:),完全封装在JavaSEAPI中,这减少了未来开发人员的“惊喜”


    (请注意,如果您的多步骤流程涉及使用“get”进行读取,即使使用
    CopyOnWriteArrayList
    也可能不完全安全。您需要评估代码的实际功能,以及交叉修改是否会破坏正在获取的方法。)

    对于1和2,我不确定您仅通过同步写入来完成什么。如果有潜在的读者可能正在迭代列表,或者正在按索引查找内容,则只有同步写入证明不了什么。在写入过程中,读者仍然能够读取,并且可能会看到脏数据或获取EXEP选项(
    并发修改
    索引自动边界

    如果希望在其他线程进行更改时进行“安全”的迭代和获取,则需要同步读写操作。此时,您还可以使用
    向量

    CopyOnWriteArrayList
    是专门为您想做的事情而构建的。它购买了安全的无同步迭代器,同时大大增加了写入成本。它还有做您想做的事情的优势(或者从简洁的问题来看,您想做什么:),完全封装在JavaSEAPI中,这减少了未来开发人员的“惊喜”


    (请注意,如果您的多步骤流程涉及使用“get”进行读取,即使使用
    CopyOnWriteArrayList
    也可能不完全安全。您需要评估代码的实际功能,以及交叉修改是否会破坏正在获取的方法。)

    如果我的列表非常大,我想这是一个更好的解决方案?好吧,它的缺点是,如果有很多读者,你的文章可能会阻塞一段时间,直到他们都消失。但是当每个人都点击CopyOnWriteArrayList时,它与CopyOnWriteArrayList有着类似的优势。我想这是一个更好的解决方案如果我的列表真的很大?那么,它的缺点是,如果有很多读者,你的写作可能会阻塞一段时间,直到他们全部消失。但它与CopyOnWriteArrayList有着类似的优势,当每个人都在阅读而不是写作时。你不应该推荐
    Vector
    :不要将其视为推荐ally.这是一个讽刺的妙语。“如果你不小心把它做对,你不会比只使用Vector更好,我们都知道Vector是一个不推荐的糟糕选择。”/Shuggyou不应该推荐
    Vector
    :不要把它看作是一个真正的推荐。这是一个讽刺的妙语。“如果你不小心做得不对,你也不会比只使用Vector更好,我们都知道Vector是一个不推荐的糟糕选择。”/耸耸肩