作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个用于统计计算的 Util 类。指数移动平均值是在多个线程之间计算的。此外,该线程传递的不同值有时是双倍的,有时是长的。我想要制作泛型,并确保在将 synchronized 应用于方法的签名时。
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。
关于java - 静态类中的线程安全和泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38198894/
我是一名优秀的程序员,十分优秀!