我有一个用于Stats计算的Util类。在多个线程之间计算指数移动平均值。此线程也会将不同的值传递一倍,而其他的则传递给其他值。我想制作泛型,并确保将同步应用于方法的签名。
public class StatUtils {
public static class WMA {
// MMA
}
public static class EMA {
/** The alpha. */
private static double staticAlpha = 0.9;
/** The old value. */
private static double staticOldValue = 1.0;
/**
* Compute.
*
* @param pValue the value
* @return the double
*/
public static synchronized double compute(double pValue) {
if (staticOldValue == 0.0) {
staticOldValue = pValue;
return pValue;
}
double lValue = staticOldValue + staticAlpha * (pValue - staticOldValue);
staticOldValue = lValue;
return lValue;
}
}
}
计算方法线程是否安全?如果是,可以使这个静态类通用吗?
答案 0 :(得分:1)
只要同步,您的方法是线程安全的,但您不能使泛型成为静态类。在实例化类时解析泛型类型,但静态类不会发生这种情况。
您可以定义一个通用方法,如:
public static synchronized <T extends Number> compute(T pValue)
但是在你的情况下,你可以简单地使用double,因为长值可以被加倍而没有问题。
答案 1 :(得分:1)
是的,您当前的方法是线程安全的。但它可能不如单个线程阻止整个1
方法那么高效。
我不确定EMA算法,但如果您可以使用几乎最新的-1
值,那么您可以改进它:
compute