java - 类级双变量的线程安全
问题描述
我有一个类级别的双变量,我已经在多线程环境中看到了一个问题。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 关键字会起作用吗?
解决方案
Java 提供了支持对单个变量进行无锁线程安全编程的原子包。当您想使用一些原语作为全局变量但又关心线程安全时,这特别有用。
现在,这个包中的这些类将为您提供帮助,但它不提供直接AtomicDouble
类,但它告诉您如何实现这一点,请参阅文档中的以下注释:
原子类不是 java.lang.Integer 和相关类的通用替代品。它们没有定义equals、hashCode和compareTo等方法。(因为预计原子变量会发生变异,所以它们不是哈希表键的糟糕选择。)此外,仅为那些在预期应用程序中通常有用的类型提供类。例如,没有用于表示字节的原子类。在您希望这样做的罕见情况下,您可以使用 AtomicInteger 来保存字节值,并进行适当的转换。您还可以使用 Float.floatToRawIntBits(float) 和 Float.intBitsToFloat(int) 转换来保持浮点数,并使用 Double.doubleToRawLongBits(double) 和 Double.longBitsToDouble(long) 转换来保持双精度。
也请阅读此答案。
推荐阅读
- android - AWS S3 同步存储桶向文件名添加随机扩展名
- sql - 结合事实表和维度表的SQL语句?
- c# - 在保持表单1中制作UserControl更改面板
- php - 使用 json_decode 访问 HTTPS 请求使我的数据消失
- php - 正则表达式使接触(无空格)的字符保持正则表达式匹配
- c# - 为什么我的积木会卡住,拒绝掉到最低层?
- javascript - 带块的作用域链如何工作?
- mysql - 将数据写入数据库/配置的 Vault 错误
- reactjs - 如何在不使用数组映射中的 DOM 或 useState 的情况下获取输入字段的更新值
- css - '& > * + *' 在 JSX (CSS) 中是什么意思?