Пусть имеем на исполнении следующий код:
package attempt;
import java.util.concurrent.*;
class Writer implements Runnable {
public void run() {
Main.x = 1;
// Main.secret();
}
}
class Reader implements Runnable {
public void run() {
// Main.secret();
System.out.println(Main.x);
}
}
public class Main {
public static int x = 0;
public static synchronized void secret() {
int unused = 5;
}
public static void main(String[] args){
ExecutorService exec = Executors.newSingleThreadExecutor();
exec.execute(new Writer());
exec.execute(new Reader());
exec.shutdown();
}
}
Можно смело заявить, что для данной программы нет никакой гарантии увидеть на выходе единицу, ведь поток Reader
'а не обязательно видит сделанные потоком Writer
'а действия (см. кэши процессоров).
Вопрос: правда ли, что если раскомментировать все комментарии программы, образуется 100%-ая гарантия того, что на выходе программы будет единица?
Другими словами: Точно ли будет так?
Main.x = 1;
<< // внутри одного потока
Main.secret(); // writer's thread
<< // между освобождением и захватом той же блокировки
Main.secret(); // reader's thread
<< // внутри одного потока
System.out.println(Main.x);
,где "<<" - happens-before.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть входное число, нужно его проверитьК примеру ввел я 1 проверить в диапазоне от 1 до 31
подскажите, как можно увеличить проводимую линию пальцем при быстром нажатии для перелистывания страницы в ViewPager
Как перевести массив int[] в массив byte[] ? Допустим имея int[] a = {29, 88 ,46};нужно перевести в массив byte[] , что бы получилось byte[] a = {29, 88 ,46};