我在运行一些计算的类中有一个静态方法,这里是代码片段:
public MyClass {
MyClass(){}
public static float runCalcs()
{
float sum;
Float[] floatArray = map.entrySet()
.stream()
.map(key -> key.getKey().getPrice())
.toArray(size -> new Float[size]);
for(int i=0; i<floatArray.length; i++) {
sum += floatArray[i];
}
return sum;
}
}
我的问题是当我从这样的线程执行此方法时:
float retVal = MyClass.runCalcs();
这是静态方法的线程安全执行还是我需要同步或锁定 MyClass.RunCalcs()以使其线程安全。
在我的应用程序中,多个线程将同时执行此方法。
请告诉我。
提前感谢!
答案 0 :(得分:3)
线程安全不是关于方法或类的问题。线程安全是关于共享数据的问题。
如果在一个线程中运行的方法可能暂时将数据置于您不希望相同方法或在不同线程中运行的任何其他方法看到的状态,那么您的共享数据是不安全的。
您的runCalcs()
方法查看的map
可能是Map
个实例,并且可能与其他某个帖子共享。
当runCalcs()
迭代地图的entrySet()
时,是否有其他方式可以改变地图的内容?如果是这样,那么您的代码就不安全了。
使其安全的方法是在迭代时更改runCalcs()
锁定锁定,并且还更改可以在另一个线程中更新map
的每个方法以锁定更改map
时相同的锁。