gpt4 book ai didi

java - 对变量的线程安全访问

转载 作者:行者123 更新时间:2023-11-30 07:45:40 24 4
gpt4 key购买 nike

我正在尝试将应用程序移植到 Java 线程安全,因此希望尽量减少所需的静态变量的数量。

我将展示一个我想澄清的问题的例子。我有一个 Eparams 类,如下所示:

public class Eparams {
private double a;

public double getA() {
return a;
}
public void setA(double a) {
this.a = a;
}
}

我在另一个类 Epi 中设置值。

public class Epi {

static Eparams eparams = new Eparams();

public void epi() {
eparams.setA(3.44);
}

public Eparams getEparams() {
return eparams;
}
}

我想在另一个类 EpiParts 中访问类型 Eparamsa 的值:

public class EpiParts {

public void test() {
Epi epi = new Epi();

Eparams eparams = epi.getEparams();

double val= eparams.getA();
System.out.print(val);
}
}

我需要 Eparams 值是非静态的,并且有多个线程访问这个类。我这样做的方式是实现这一目标的最佳方式吗?

如果我在 Epi 中声明一个 Eparams 的新实例是静态的,线程访问这个实例有什么影响?使这个实例静态化是我让它工作的唯一方法。

这是错误的做法吗?有没有更简单的方法以线程安全的方式跨不同的类检索值(除了函数参数和返回值)?

最佳答案

If I declare in Epi a new instance of Eparams to be static, what are the implications of threads accessing this instance? Making this instance static was the only way I got it to work.

static 不会以任何方式使成员线程安全,只是通过类名简化了对它的访问。

Is this the wrong way to go about this?

是的,现在对 a 的访问根本不安全。

我在这里建议的选项:

  1. 使用同步访问器。

  2. 使用 AtomicLong变量与 Double.longBitsToDouble(long)Double.doubleToLongBits(double)分别为 getter 和 setter 进行转换。

Is there an easier way ... ?

考虑第一种方法,它简单而严格。

关于java - 对变量的线程安全访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51538512/

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