java - 变量的线程安全访问

标签 java multithreading thread-safety

我正在尝试将应用程序移植到 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;
    }
}

我想访问另一个类 EpiPartsEparams 类型的 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的访问根本不安全。

我在这里建议的选项:

  1. 使用同步访问器。

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

Is there an easier way ... ?

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

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

相关文章:

java - MyBatis 和嵌套Where 子句

java - 不同线程中的 DecimalFormat.format(double)

c# - ASP.NET 多线程是否影响 Structuremap 单例类?

java - 匿名类的内存后果

java - 在Java中,对字符串的只读访问是否需要同步?

java - 从另一个线程内调用 TimerTask 是线程安全的

java - 通过 CLI : Could not find or load main class org. testng.TestNG 执行 testng.xml 时出错

java - 导致 java.lang.OutOfMemoryError : PermGen space error 的算法

java - 如何将 HttpServletRequest 对象传递给测试用例?

java - 如何根据用户定义的参数执行 throttle ?