[英]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.