静态类中的线程安全性和泛型

时间:2016-07-05 08:42:22

标签: java multithreading generics static thread-safety

我有一个用于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;
        }
    }
}

计算方法线程是否安全?如果是,可以使这个静态类通用吗?

2 个答案:

答案 0 :(得分:1)

只要同步,您的方法是线程安全的,但您不能使泛型成为静态类。在实例化类时解析泛型类型,但静态类不会发生这种情况。

您可以定义一个通用方法,如:

public static synchronized <T extends Number> compute(T pValue)

但是在你的情况下,你可以简单地使用double,因为长值可以被加倍而没有问题。

答案 1 :(得分:1)

是的,您当前的方法是线程安全的。但它可能不如单个线程阻止整个1方法那么高效。

我不确定EMA算法,但如果您可以使用几乎最新的-1值,那么您可以改进它:

compute