public class Stuff {
private final Timer timer = new Timer(true);
public static final int DEFAULT_TIMEOUT = 1500;
private volatile int timeout = DEFAULT_TIMEOUT;
public void doStuff(OtherStuff) {
...
timer.schedule(timeout, ...);
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
public int getTimeout() {
return timeout;
}
}
此类的实例仅从 1 个线程访问,但可以从另一个类更改的超时变量除外。在我的例子中是一个 JMX bean,这意味着可以在运行时从管理界面更改超时。
doStuff() 可以运行 100 次/秒,而 setTimeout() 可以每周运行一次 - 因此执行 setTimeout() 的人和执行 doWork() 的人之间的顺序并不重要。
timeout
对于这种情况,使volatile 足够吗?内存模型会保证从一个线程设置此方法对doStuff()
方法可见吗?
另一个看起来安全的替代方案就是:
public class Stuff {
private final Timer timer = new Timer(true);
public static final int DEFAULT_TIMEOUT = 1500;
private int timeout = DEFAULT_TIMEOUT;
public void doStuff(OtherStuff) {
...
timer.schedule(getTimeout(), ...);
}
public void synchronized setTimeout(int timeout) {
this.timeout = timeout;
}
public int synchronized getTimeout() {
return timeout;
}
}
这两种方法中的哪一种更受欢迎?