- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在java多线程中有一个用例,我需要知道是否需要同步这种情况下的列表数据结构。还尝试实现不同步的情况。
用例:
我正在尝试收集一些统计数据,我可能需要增加一些值集。为此,我预加载了一个包含 8 个元素的数组列表,并且全部初始化为 0。当请求到达时,每个请求将根据请求中的数据递增(更新)任何一个元素(使用索引)。因此,统计数据将被收集在此数组列表中。这是唯一一个将访问该列表并按顺序写入的线程。在任何情况下,都不会并行写入此列表中的元素。
我将有一个读取器线程,它可能会尝试每 2 分钟从该数组列表获取所有数据。将构建一个针对列表大小的 for 循环,并通过其索引获取元素。我什至可以从列表中获取一些旧数据。
问题:
我需要知道这个数组列表是否需要针对上述使用模式进行同步??
如果不需要同步,并行操作两个线程不应引发任何类型的异常,尽管在读取器线程中获取少量陈旧数据是可以的。
如果需要同步,这对我来说将是一个性能打击,因为这个列表仅用于收集统计数据,我无法通过同步使其过载。对于这种情况,还有其他没有同步的解决方案吗?
最佳答案
由于有两个线程会访问 ArrayList,因此需要同步。
同步不仅仅是写入,还涉及读取,这样 Reader 线程就不会读取过时的值。
正如 @OldCurmudgeon 所建议的,您可以拥有 AtomicLong 值的 ArrayList。AtomicLong 中的incrementAndGet() 方法使递增原子化,因此不会读取过时的值。
针对您的问题
- 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)
- 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 读取数据时。
- 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/
我是一名优秀的程序员,十分优秀!