relock для получения отношения happens-before

151
06 мая 2018, 21:10

Пусть имеем на исполнении следующий код:

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.

READ ALSO
Как проверить строку на один из вариантов правильно?

Как проверить строку на один из вариантов правильно?

Есть входное число, нужно его проверитьК примеру ввел я 1 проверить в диапазоне от 1 до 31

184
прокрутка листов в ViewPager

прокрутка листов в ViewPager

подскажите, как можно увеличить проводимую линию пальцем при быстром нажатии для перелистывания страницы в ViewPager

169
Перевод массива типа int в массив типа byte

Перевод массива типа int в массив типа byte

Как перевести массив int[] в массив byte[] ? Допустим имея int[] a = {29, 88 ,46};нужно перевести в массив byte[] , что бы получилось byte[] a = {29, 88 ,46};

191
Ошибка при создании связи mySQL

Ошибка при создании связи mySQL

При попытке создать связь выскакивает ошибка

178