以下是来自网上的访谈问题:
设计一个任务调度系统,包括一个任务队列和两个函数。
(1)功能:triggerTask。这个负责调用任务队列中的所有任务。
(2)功能:addTask。在调用triggerTask函数之前,addTask将任务添加到队列中。在调用triggerTask函数之后,addTask只调用该任务。
以下是我的回答:
class TriggerTask {
Queue<Task> q;
boolean triggered = false;
addTask(Task t) {
if (triggered == true) {
t.invoke();
}
else {
q.offer(t);
}
}
triggerTask() {
triggered = true;
while (!q.isEmpty()) {
q.poll().invoke();
}
}
如果您希望您的设计在多线程情况下运行,那么后续问题是什么?我有点失落了。上述代码在多线程情况下运行有什么问题吗?如果是,如何解决?
答案 0 :(得分:0)
当Thread1调用triggerTask()时,触发的布尔变量将设置为true,但调用addTask()的Thread2可能会读取缓存内存中触发的值,因此它不会将其值视为true。为避免这种情况,您需要将trigger声明为volatile。