我有一个简单的类,它在自己的线程中进行一些计算,并将结果报告给监听器。
class Calculator extends Thread {
protected Listener listener;
public void setListener(Listener l) {
listener = l;
}
public void run() {
while (running) {
... do something ...
Listener l = listener;
if (l != null) {
l.onEvent(...);
}
}
}
}
任何时候,用户都可以调用 setListener(null) 来暂停一段时间内的任何事件。因此,在 run() 函数中,我创建了一个监听器的副本,这样就不会遇到空指针异常,即使在 != null 条件检查成功后将监听器设置为 null。在我的情况下,我认为这是同步的正确替代方案。
我的问题是:我应该将此处的监听器成员变量声明为 volatile 吗?我已经阅读了很多关于 volatile 的文章,但所有的例子似乎都针对基本数据类型(布尔型、整数等),而不是对象。因此,我不确定对象是否也应该被声明为 volatile。我认为我必须将其声明为 volatile,以便线程始终具有成员变量的最新版本,但我不确定。
谢谢!
isEventAvailable()
)。如果评估为true,则执行onEvent
,否则不执行任何操作。此外,如果您想要停止该线程,您必须将running
声明为volatile
。 - mre