多线程应用中的同步问题——java

多线程应用中的同步问题——java,java,multithreading,synchronization,Java,Multithreading,Synchronization,以下是一个来自网上的采访问题: 设计了一个包含任务队列和两个功能的任务调度系统 1功能:触发任务。这个任务负责调用任务队列中的所有任务 2功能:添加任务。在调用triggerTask函数之前,addTask会将task添加到队列中。调用triggerTask函数后,addTask只调用任务 以下是我的答案: class TriggerTask { Queue<Task> q; boolean triggered = false; addTask(Task

以下是一个来自网上的采访问题:

设计了一个包含任务队列和两个功能的任务调度系统

1功能:触发任务。这个任务负责调用任务队列中的所有任务

2功能:添加任务。在调用triggerTask函数之前,addTask会将task添加到队列中。调用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();
          }
   }

接下来的问题是,如果希望设计在多线程情况下运行,该怎么办?我把它弄丢了。以上代码在多线程情况下运行是否有任何问题?如果是,如何解决?

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