gpt4 book ai didi

Java 线程同步,最佳并发实用程序,读取操作

转载 作者:搜寻专家 更新时间:2023-10-31 19:41:43 24 4
gpt4 key购买 nike

我有一个 java 线程相关的问题。

举一个非常简单的例子,假设我有 2 个线程。

Thread 一个正在运行的 StockReader 类实例

线程 B 运行 StockAvgDataCollector 类实例

在线程 B 中,StockAvgDataCollector 不断收集一些市场数据,进行一些繁重的平均/操作并更新一个成员变量 spAvgData

在 Thread 中,StockReader 可以使用 getspAvgData() 方法访问 StockAvgDataCollector 实例及其成员 spAvgData。

所以线程 A 只做读操作,线程 B 做读/写操作。

问题

  1. 现在,在这种情况下我是否需要同步或原子功能或锁定或任何与并发相关的东西?线程 A 是否读取旧值并不重要。

  2. 由于线程 A 只读,不更新任何东西,只有线程 B 做任何写操作,是否会出现死锁情况?

我从以下链接粘贴了一段话。从该段来看,我似乎确实需要担心某种锁定/同步。

http://java.sun.com/developer/technicalArticles/J2SE/concurrency/

读者/作者锁

当使用一个线程从对象中读取数据时,不一定需要阻止另一个线程同时读取数据。只要线程只读取数据而不更改数据,就没有理由不能并行读取。 J2SE 5.0 java.util.concurrent.locks 包提供了实现这种类型锁定的类。 ReadWriteLock 接口(interface)维护一对关联的锁,一个用于只读,一个用于写入。 readLock() 可以由多个读取线程同时持有,只要没有写入程序。 writeLock() 是独占的。虽然从理论上讲,很明显使用读/写锁来增加并发性会导致比使用互斥锁更高的性能。然而,这种性能改进只有在多处理器上才能完全实现,并且数据读取频率与修改频率以及读写操作的持续时间相比。

哪个并发实用程序更便宜且适合我的示例?

java.util.concurrent.atomic ?

java.util.concurrent.locks ?

java.util.concurrent.ConcurrentLinkedQueue ? - 在这种情况下,StockAvgDataCollector 将添加,而 StockReader 将删除。不会公开 getspAvgData() 方法。

谢谢阿米特

最佳答案

好吧,当你有很多读者和至少一个作者时,整个 ReadWriteLock 事情真的很有意义......所以你保证活跃(如果没有其他线程正在写入,你不会阻塞任何读者线程)。但是,您只有两个线程。

如果您不介意线程 B 读取 spAvgData 的旧值(但未损坏),那么我会选择 AtomicDouble(或 AtomicReference,具体取决于 spAvgData 的数据类型)。

所以代码看起来像这样

public class A extends Thread {
// spAvgData
private final AtomicDouble spAvgData = new AtomicDouble(someDefaultValue);

public void run() {
while (compute) {
// do intensive work
// ...
// done with work, update spAvgData
spAvgData.set(resultOfComputation);
}
}

public double getSpAvgData() {
return spAvgData.get();
}
}
// --------------

public class B {
public void someMethod() {
A a = new A();
// after A being created, spAvgData contains a valid value (at least the default)
a.start();
while(read) {
// loll around
a.getSpAvgData();
}
}
}

关于Java 线程同步,最佳并发实用程序,读取操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4939641/

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