簡體   English   中英

靜態類中的線程安全性和泛型

[英]Thread safety and generics in a static class

我有一個用於統計計算的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;
        }
    }
}

計算方法線程安全嗎? 如果是,是否可以使此靜態類通用?

只要同步,您的方法就是線程安全的,但是您不能將泛型設為靜態類。 實例化類時,將解析泛型類型,但對於靜態類則永遠不會發生。

您可以定義一個通用方法,例如:

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

但是在您的情況下,您可以簡單地使用double,因為可以將long值強制轉換為double而不會有問題。

是的,您當前的方法是線程安全的。 但是,效率可能不如單個線程阻止整個compute方法那樣高效。

我不確定EMA算法,但是如果您確定線程使用了staticOldValue幾乎最新值,則可以像下面這樣進行改進:

  public static class EMA {

    /** The alpha. */
    private static double staticAlpha = 0.9;

    /** The old value. */
    private static double staticOldValue = 1.0;

    private static Object monitor = new Object();

    /**
     * Compute.
     *
     * @param pValue the value
     * @return the double
     */
    public static double compute(double pValue) {
      synchronized (monitor) {
        if (staticOldValue == 0.0) {
          staticOldValue = pValue;
          return pValue;
        }
      }

      double lValue = staticOldValue + staticAlpha * (pValue - staticOldValue);
      synchronized (monitor) {
        staticOldValue = lValue;
      }

      return lValue;
    }
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM