首页 > 解决方案 > 类级双变量的线程安全

问题描述

我有一个类级别的双变量,我已经在多线程环境中看到了一个问题。A 类由具有不同列表的多个线程调用。考虑到它的性能关键应用程序,使 var1 线程安全的最佳方法是什么?

class A {

 private double var1= 0.25

 public methodB(List<MyObj> lst){
    for (MyObj obj : lst){
     methodA (obj);
    }
 }

  public void methodA(MyObj obj){
    if(obj.getVal.equals("someString")) {
    var1= 0.15;
    }
  //do something with var1
 } // end of method
} // end of class

在这种情况下 volatile 关键字会起作用吗?

标签: javathread-safety

解决方案


Java 提供了支持对单个变量进行无锁线程安全编程的原子包。当您想使用一些原语作为全局变量但又关心线程安全时,这特别有用。

现在,这个包中的这些类将为您提供帮助,但它不提供直接AtomicDouble类,但它告诉您如何实现这一点,请参阅文档中的以下注释:

原子类不是 java.lang.Integer 和相关类的通用替代品。它们没有定义equals、hashCode和compareTo等方法。(因为预计原子变量会发生变异,所以它们不是哈希表键的糟糕选择。)此外,仅为那些在预期应用程序中通常有用的类型提供类。例如,没有用于表示字节的原子类。在您希望这样做的罕见情况下,您可以使用 AtomicInteger 来保存字节值,并进行适当的转换。您还可以使用 Float.floatToRawIntBits(float) 和 Float.intBitsToFloat(int) 转换来保持浮点数,并使用 Double.doubleToRawLongBits(double) 和 Double.longBitsToDouble(long) 转换来保持双精度。



也请阅读此答案


推荐阅读