gpt4 book ai didi

java - 关于java多线程用例的查询

转载 作者:太空宇宙 更新时间:2023-11-04 11:54:47 24 4
gpt4 key购买 nike

我在java多线程中有一个用例,我需要知道是否需要同步这种情况下的列表数据结构。还尝试实现不同步的情况。

用例:

我正在尝试收集一些统计数据,我可能需要增加一些值集。为此,我预加载了一个包含 8 个元素的数组列表,并且全部初始化为 0。当请求到达时,每个请求将根据请求中的数据递增(更新)任何一个元素(使用索引)。因此,统计数据将被收集在此数组列表中。这是唯一一个将访问该列表并按顺序写入的线程。在任何情况下,都不会并行写入此列表中的元素。

我将有一个读取器线程,它可能会尝试每 2 分钟从该数组列表获取所有数据。将构建一个针对列表大小的 for 循环,并通过其索引获取元素。我什至可以从列表中获取一些旧数据。

问题:

  1. 我需要知道这个数组列表是否需要针对上述使用模式进行同步??

  2. 如果不需要同步,并行操作两个线程不应引发任何类型的异常,尽管在读取器线程中获取少量陈旧数据是可以的。

  3. 如果需要同步,这对我来说将是一个性能打击,因为这个列表仅用于收集统计数据,我无法通过同步使其过载。对于这种情况,还有其他没有同步的解决方案吗?

最佳答案

由于有两个线程会访问 ArrayList,因此需要同步。

同步不仅仅是写入,还涉及读取,这样 Reader 线程就不会读取过时的值。

正如 @OldCurmudgeon 所建议的,您可以拥有 AtomicLong 值的 ArrayList。AtomicLong 中的incrementAndGet() 方法使递增原子化,因此不会读取过时的值。

针对您的问题

  1. I need to know on whether this arraylist needs to be synchronized for the >>above usage pattern ??

ArrayList 的获取和设置都需要同步。您可以使用
List<AtomicLong> stats = new ArrayList<AtomicLong>();
stats = Collections.synchronizedList(List<T> list)

  1. If it not required to be sychronized, operating both threads in parallel >>should not throw any kind of exception, though getting little stale data in >>reader thread is fine.

不同步的代码也可以工作。唯一可能抛出错误的情况是当您尝试向 ArrayList 添加元素,同时 ReaderThread 使用 Iterator 从 ArrayList 读取数据时。

  1. If it needs to be synchronized, it will be a performance hit for me since >>this list is only for collecting stats and i can't overload it with >>synchronization. Any other solution without synchronization for this case.. ?

创建 AtomicLong 的同步列表。
使用“get”操作从列表中读取。使用incrementAndGet()方法写入线程。

关于java - 关于java多线程用例的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41467408/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com