Java 多线程程序中类的静态方法的执行是线程安全的吗?
我在一个运行一些Calc的类中有一个静态方法,下面是代码片段:Java 多线程程序中类的静态方法的执行是线程安全的吗?,java,multithreading,Java,Multithreading,我在一个运行一些Calc的类中有一个静态方法,下面是代码片段: public MyClass { MyClass(){} public static float runCalcs() { float sum; Float[] floatArray = map.entrySet() .stream() .map(key -> key.getKey().getPrice())
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;
}
}
这是静态方法的线程安全执行,还是需要同步或锁定MyClass.RunCalcs()以使其线程安全在我的应用程序中,多个线程将同时执行此方法。
请告诉我。
提前感谢 线程安全不是关于方法或类的问题。线程安全是一个关于共享数据的问题 如果在一个线程中运行的方法可能会暂时将数据置于您不希望在不同线程中运行的相同方法或任何其他方法看到的状态,则共享数据是不安全的 您的
runCalcs()
方法查看map
,它可能是一个map
实例,可能与其他线程共享
当runCalcs()
在映射的entrySet()上迭代时,另一个线程是否有任何方法可以更改映射的内容?如果是这样,那么您的代码是不安全的
安全的方法是在迭代时更改runCalcs()
锁定一个锁,并且在不同的线程中更改可以更新map
的每个方法,以在更改map
时锁定同一个锁,而map
来自哪里?这取决于map
(必须有一些静态上下文)可以在执行runCalcs()
时由其他线程更新。地图数据填充在另一个线程@Dominik sandjajaja中感谢您的建议@james large!是的,映射数据由线程共享,但每个线程过滤掉与需要执行的工作相关的数据,然后更新映射中的对象。我要试试上锁的路线
float retVal = MyClass.runCalcs();