要强制取消AsyncTask不应该在doInBackground中定期检查的标志是volatile吗?

Mar*_*och 10 multithreading android volatile synchronized android-asynctask

我想强制取消AsyncTask.我看到你可以像这个有效的解决方案一样使用isCancelled()(它在引擎盖下使用AtomicBoolean.

但是我看到了像suspiciousSolution1,suspiciousSolution2,suspiciousSolution3这样的解决方案,其中引入了新的标志private boolean isTaskCancelled = false;.

我开始想知道 - 因为那个标志被修改了

public void cancelTask(){
   isTaskCancelled = true;
}
Run Code Online (Sandbox Code Playgroud)

它在某些线程上运行,并被读入

protected Void doInBackground( Void... ignoredParams ) {
    //Do some stuff
    if (isTaskCancelled()){
        return;
    }
}
Run Code Online (Sandbox Code Playgroud)

WorkerThread中运行,然后标志不应该isTaskCancelled是volatile(或者像Google的实现中的AtomicBoolean).

sui*_*shi 5

是的,它应该是volatile.否则,由于优化(通过编译器,JVM等),对线程A中的变量的写入可能对线程B中的读取不可见.看到这个