涉及多线程应用程序的同步问题 - java

时间:2015-06-18 05:56:17

标签: java multithreading synchronization

以下是来自网上的访谈问题:

设计一个任务调度系统,包括一个任务队列和两个函数。

(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();
          }
   }

如果您希望您的设计在多线程情况下运行,那么后续问题是什么?我有点失落了。上述代码在多线程情况下运行有什么问题吗?如果是,如何解决?

1 个答案:

答案 0 :(得分:0)

当Thread1调用triggerTask()时,触发的布尔变量将设置为true,但调用addTask()的Thread2可能会读取缓存内存中触发的值,因此它不会将其值视为true。为避免这种情况,您需要将trigger声明为volatile。