Я использовал этот шаблон некоторое время, но я только недавно пришел к мысли, что это может быть не так. В основном, я использую некий вариант этой модели:Неувязчивые «флаги» threadsafe в Java?
public class SampleJavaAsync
{
public SampleJavaAsync() { }
private boolean completed;
public void start()
{
new Thread(new Runnable() {
@Override
public void run() {
//... do something on a different thread
completed = true;
}
}).start();
}
public void update()
{
if (!completed) return;
//... do something else
}
}
* Пользователь несет ответственность за то, чтобы start
вызывалась только один раз. update
называется везде и где угодно.
Я всегда предполагал, что это потокобезопасно на Java, потому что, хотя ничто не строго синхронизировано, я только установил completed
в true. Как только будет наблюдаться true
, он не будет сброшен до false
. Он инициализируется значением false в конструкторе, который по определению является потокобезопасным (если вы не делаете в нем что-то глупое). Таким образом, безопасно ли использовать потоки с помощью несанкционированных флагов? (И если да, то это даже дает никаких преимуществ производительности?)
Благодаря
Спасибо за ответ! – aboveyou00