На вашем месте я бы реализовал блокировку Mutex при доступе к переменной flag. Поэтому, прежде чем прочитать значение флага или изменить его значение, поток должен получить блокировку. Таким образом, они никогда не читают его в одно и то же время и не записывают новое значение, пока старое не будет прочитано и т. Д.
РЕДАКТИРОВАТЬ: Больше объяснений
@ paul Чтобы объяснить, что делает блокировка: это в основном шар, который можно перебросить нитями. Так что, если вы сидите в кругу с группой людей, и у вас есть мяч, ваша очередь говорить о «Х». Затем, когда вы закончите говорить, вы помещаете мяч в центр круга, и он остается там до тех пор, пока тот же человек или кто-то еще не захочет снова получить мяч и не заберет его или не дождется, пока он не станет доступным, и затем может говорить о «Х». В вашем случае поток должен иметь блокировку для изменения или чтения флага переменной, поэтому вы должны сделать следующее:
Mutex lock = new Mutex();
lock.aquire();
if ( flag == something ){
//do something
}
mutex.release()
или если вы меняете флаг.
lock.aquire();
flag = something;
lock.release();
Как видите, блокировка разделяется между потоками. Поэтому он создается в классе, который управляет потоками, и передается Runnable Objects или методам, которые запускаются в потоках.
Итак:
Mutex lock = new Mutex();
Runnable1 r1 = new Runnable1(lock);
Runnable2 r2 = new Runnable2(lock);
//use the lock in the methods of t1 and t2 that use your volitile var
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
//the join wait for completion of the runnable method in your class.
t1.join();
t2.join();
Удачи:)