powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Задачка на ночь
25 сообщений из 68, страница 1 из 3
Задачка на ночь
    #38764092
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
final class C {
  private int a;
  
  C() {
    a = 42;
    synchronized(this) {}
  }
  
  int getA() {
    synchronized(this){}
    return a;
  }
}




ПОТОК 1
Код: java
1.
2.
C c = new C();
GLOBAL = c;//GLOBAL - НЕ volatile поле, т.е. публикуем через data race




ПОТОК 2
Код: java
1.
2.
3.
4.
5.
6.
C c = GLOBAL;
if(c != null) {
  System.out.println(c.getA());
} else {
  System.out.println("null");
}



Что может напечатать ПОТОК2?
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764125
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО все 3 варианта, а что разве volatile спасает от race?
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764128
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хз, не отвечу. Понятно, что если бы не synchronized, то было бы [null, 0, 42]. В рассматриваем же примере, надо понять возможен ли 0. А это зависит от того, во что скомпилируется пустой synchronized-блок. Если JVM его выкосит целиком, то 0 возможен. Если же она выкосит саму логику монитора, но при этом оставит барьеры, а именно StoreLoad после выхода из synchronized, то 0 не будет.
В общем, я бы включил PrintAssembly, дождался бы компиляции, и посмотрел на ассемблю С() и getA(). Если увидим там мониторную lock addl(esp, 0), значит 0 невозможен. В противном случае - возможен.

Но я все же склоняюсь к тому, что ноль здесь невозможен, в противном случае это нарушает заветы JMM.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764136
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, все нормально будет - без 0. Только что проверил на коде из своего тренинга, в котором вылетает NPE, если нет final. Вот сам код:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
public class EscapeRunner {

    private static Holder holder;

    private static MyClass obj;

    public static void main(String[] args) {
        refreshObject();

        final AtomicBoolean stopFlag = new AtomicBoolean();

        Thread writer = Utils.wrapInThread(new Runnable() {
            @Override public void run() {
                while (!stopFlag.get())
                    refreshObject();
            }
        }, true);

        Thread reader = Utils.wrapInThread(new Runnable() {
            @Override public void run() {
                while (!stopFlag.get()) {
                    MyClass regularObj = obj;
                    MyClass holderObj = holder.obj;

                    regularObj.use();
                }
            }
        }, true);

        Utils.sleep(2000000);

        stopFlag.set(true);

        Utils.join(writer, reader);
    }

    private static void refreshObject() {
        obj = new MyClass();
        holder = new Holder(obj);
    }

    private static class Holder {
        private final MyClass obj;

        private Holder(MyClass obj) {
            this.obj = obj;
        }
    }

    private static class MyClass {
        private Object obj1;
        private Object obj2;

        private MyClass() {
            this.obj1 = new Object();
            this.obj2 = new Object();
        }

        private int use() {
            Object o1 = obj1;
            Object o2 = obj2;

//            Utils.printWithThreadName("" + (o1 != null) + " " + (o2 != null));

            return o1.hashCode() + o2.hashCode();
        }
    }
}

На класс Holder забейте, он из другой оперы. Utils.* методы надо либо выпилить, либо заменить на обычный Runnable. На Винде, Java 1.7 сорок-какая-то-там вылетает NPE из-за data race. Если запилить synchronized по аналогии с примером, то все нормально. Ассембли я не смотрел, но там точно либо останется StoreLoad от synchronized, либо же JIT сам допенькает, что реордерить нельзя.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764234
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[42, null] / [42, null, 0]
Результат зависит только от того, а выбрасывает ли JVM пустые synchronized-блоки.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764240
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schwa[42, null] / [42, null, 0]
Результат зависит только от того, а выбрасывает ли JVM пустые synchronized-блоки.Нет, результат зависит от того, насколько корректно она их выбрасывает. Корректно.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764242
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvschwa[42, null] / [42, null, 0]
Результат зависит только от того, а выбрасывает ли JVM пустые synchronized-блоки.Нет, результат зависит от того, насколько корректно она их выбрасывает. Корректно.
Нет. Результат зависит от того, а запускается ли код на ai64, ARM-е или POWER.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764253
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А с чего бы вдруг уважающая себя JVM должна выкидывать инструкции являющиеся точками hb ?
Это ж форменный беспредел )))
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764257
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Свеном ну твой пример это не доказательство

А слабо на языке отношений доказать ?
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764259
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892ИМХО все 3 варианта, а что разве volatile спасает от race?

Ну если мы записали в волатайл поле - то вскоре таки прочтем то что записали там же hb как никак между записью и чтением
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764277
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если поток один записал в память 42, но lock еще не получил, в то время как 2й с локом читает?
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764362
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schwaНет. Результат зависит от того, а запускается ли код на ai64, ARM-е или POWER.Нет, результат зависит от того, нарушает ли JIT модель памяти при оптимизациях или нет. Я склонен думать, что не нарушает, достаточно выпилить саму логику монитора, но оставить барьеры по краям. Логика, сэр.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764365
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buldozer01А с чего бы вдруг уважающая себя JVM должна выкидывать инструкции являющиеся точками hb ?
Это ж форменный беспредел )))+1.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764375
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Результат опроса пока радует))))

В серьезные конторы где JSP и Struts это ругательства конкуренция не столь большая будет))))
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764392
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schwaНет. Результат зависит от того, а запускается ли код на ai64, ARM-е или POWER. https://github.com/openjdk-mirror/jdk7u-hotspot/blob/50bdefc3afe944ca74c3093e7448d6b889cd20d1/src/share/vm/opto/macro.cpp , строчка 1958.
Шах и мат, schwa!
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764404
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buldozer01Результат опроса пока радует))))
В серьезные конторы где JSP и Struts это ругательства конкуренция не столь большая будет))))Ответственно заявляю вам - конкуренции практически нет. Так как нет и большого числа годных разработчиков.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764415
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892а если поток один записал в память 42, но lock еще не получил, в то время как 2й с локом читает?В это случае вы не увидите null в GLOBAL. Тут вопрос только в том, может ли присвоение 42 "убежать" за присвоение GLOBAL. Как показывает анализ исходников Hotspot - не может.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764433
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Свеном такие задачки решаются на языке математики и отношений
В данном случае это SO , HB , PO
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764465
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buldozer01Свеном такие задачки решаются на языке математики и отношений
В данном случае это SO , HB , POЕсли вам нравится мозгодрочка - решайте. Мне это не надо, я вижу data race на автомате. В данном случае все кристально ясно - между выходом из C() и входом в getA() есть HB. Вопрос был только в том, не исчезнет ли это HB при выпиливании пустых критических секций. И, кажется, я дал достаточно убедительный ответ.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764469
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvbuldozer01Свеном такие задачки решаются на языке математики и отношений
В данном случае это SO , HB , POЕсли вам нравится мозгодрочка - решайте. Мне это не надо, я вижу data race на автомате. В данном случае все кристально ясно - между выходом из C() и входом в getA() есть HB. Вопрос был только в том, не исчезнет ли это HB при выпиливании пустых критических секций. И, кажется, я дал достаточно убедительный ответ.

Мозгодрочка ??? )))))))
Ну Ну

Я думал ты серьезный программист а ты ж джедай точно)))
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764475
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buldozer01Мозгодрочка ??? )))))))
Ну Ну
Я думал ты серьезный программист а ты ж джедай точно)))Умножьте 8 на 9. Вы это как делаете - столбиком, или "на автомате". А эотт кмомнетаирй пеерчтиайте еще раз. Вы как это сделали - по слогам, или "на автомате"?
Когда у тебя за спиной много тысяч строк конкурентного кода, тебе не нужны никакие SO и PO. Максимум - HB. А про эти абстрактные вещи имеет смысл рассуждать либо в рамках образовательного процесса, либо в рамках мозгодрочки в concurrency-interest.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764483
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программисты делятся на несколько групп

1) Джедаи
2) Евангелисты
3) Тупо сидим курим, формочки клипаем и снимает ЗП с карточки
4) Серьезные академически грамотные разработчики

Ты видимо из первых - я стараюсь двигаться к четвертым
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764532
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv,

Какой мат, уважаемый? Никто не пытался тебе ничего доказывать.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764543
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schwaКакой мат, уважаемый? Никто не пытался тебе ничего доказывать.Все верно. Доказывали не вы, доказывали вам.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764545
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buldozer01Программисты делятся на несколько групп

1) Джедаи
2) Евангелисты
3) Тупо сидим курим, формочки клипаем и снимает ЗП с карточки
4) Серьезные академически грамотные разработчики

Ты видимо из первых - я стараюсь двигаться к четвертымКакодемонов еще забыли. Мне побоку на эти группы, я не принадлежу ни к одной из них. Я разработчик.
...
Рейтинг: 0 / 0
25 сообщений из 68, страница 1 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / Задачка на ночь
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]