Если вы используете базовый поток, поле участника не будет синхронизировано, и видимость не будет гарантирована, как вы упомянули.
В случае использования AsyncTask это зависит от реализации инфраструктуры AsyncTask.
"one", 1
определенно будет там, потому что он помещается до создания потока.
Если мы проверим исходный код AsyncTask , мы сможем найти следующий комментарий:
* <h2>Memory observability</h2>
* <p>AsyncTask guarantees that all callback calls are synchronized in such a way that the following
* operations are safe without explicit synchronizations.</p>
* <ul>
* <li>Set member fields in the constructor or {@link #onPreExecute}, and refer to them
* in {@link #doInBackground}.
* <li>Set member fields in {@link #doInBackground}, and refer to them in
* {@link #onProgressUpdate} and {@link #onPostExecute}.
* </ul>
Так что "three", 3
будет там, так как он был добавлен в onPreExecute
.
Также это означает, что поле ContentValues contentValues;
будет синхронизировано в точке doInBackground
, поэтому метод вернет true.
Хотя я не думаю, что элемент "two", 2
гарантированно будет там, поскольку этот код выполняется параллельно с асинхронным потоком. Может быть, но не обязательно. На это могут влиять как раса, так и аспекты видимости.