【发布时间】:2016-09-03 12:50:27
【问题描述】:
我定义了以下类和内部“AsyncTask”(http://developer.android.com/reference/android/os/AsyncTask.html)。
class SomeClassA {
Long b = 0;
void executeTask() {
// executed on main thread.
b = 1;
new SomeAsyncTask().execute();
}
private class SomeAsyncTask extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... params) {
b = 3;
}
protected void onPostExecute(Void param) {
System.out.println(b);
}
}
}
我很好奇我在 AsyncTask 的“内存可见性”以及线程安全方面得到了什么保证。据我了解,调用“doInBackground”是在单独的线程中执行的,因此我对“doInBackground”中的“b”所做的任何更改都不能保证在主线程上执行的任何回调中都是“可见的”(例如“onPostExecute()”、“onPreExecute”、“onProgressUpdate”等)。
这是正确的吗?因此,在上面的示例中,“onPostExecute”中的“System.out.println(b)”可以打印 1 或 3,但不能保证。我必须做些什么来保证这种内存可观察性?
在 AsyncTask 网站(上面发布)中,我看到了以下 sn-p。
内存可观察性
AsyncTask 保证所有回调调用都以这样一种方式同步,即以下操作在没有显式同步的情况下是安全的。
- 在构造函数或onPreExecute()中设置成员字段,并在doInBackground(Params...)中引用。
- 在doInBackground(Params...)中设置成员字段,在onProgressUpdate(Progress...)和onPostExecute(Result)中引用。
我认为这个“可能”解释了我的困惑,但我不明白这意味着什么。谁能给我解释一下?
【问题讨论】: