我正在尝试将应用程序移植到 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
中 Eparams
类型的 a
的值:
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
的访问根本不安全。
我在这里建议的选项:
使用
同步
访问器。使用
AtomicLong
变量Double.longBitsToDouble(long)
和Double.doubleToLongBits(double)
分别为 getter 和 setter 进行转换。
Is there an easier way ... ?
考虑第一种方法,它简单而严格。
关于java - 变量的线程安全访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51538512/