Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Задачка на ночь / 25 сообщений из 68, страница 1 из 3
01.10.2014, 23:34
    #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
02.10.2014, 00:57
    #38764125
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка на ночь
ИМХО все 3 варианта, а что разве volatile спасает от race?
...
Рейтинг: 0 / 0
02.10.2014, 01:02
    #38764128
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка на ночь
Хз, не отвечу. Понятно, что если бы не synchronized, то было бы [null, 0, 42]. В рассматриваем же примере, надо понять возможен ли 0. А это зависит от того, во что скомпилируется пустой synchronized-блок. Если JVM его выкосит целиком, то 0 возможен. Если же она выкосит саму логику монитора, но при этом оставит барьеры, а именно StoreLoad после выхода из synchronized, то 0 не будет.
В общем, я бы включил PrintAssembly, дождался бы компиляции, и посмотрел на ассемблю С() и getA(). Если увидим там мониторную lock addl(esp, 0), значит 0 невозможен. В противном случае - возможен.

Но я все же склоняюсь к тому, что ноль здесь невозможен, в противном случае это нарушает заветы JMM.
...
Рейтинг: 0 / 0
02.10.2014, 01:23
    #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
02.10.2014, 08:29
    #38764234
schwa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка на ночь
[42, null] / [42, null, 0]
Результат зависит только от того, а выбрасывает ли JVM пустые synchronized-блоки.
...
Рейтинг: 0 / 0
02.10.2014, 08:39
    #38764240
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка на ночь
schwa[42, null] / [42, null, 0]
Результат зависит только от того, а выбрасывает ли JVM пустые synchronized-блоки.Нет, результат зависит от того, насколько корректно она их выбрасывает. Корректно.
...
Рейтинг: 0 / 0
02.10.2014, 08:41
    #38764242
schwa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка на ночь
cdtyjvschwa[42, null] / [42, null, 0]
Результат зависит только от того, а выбрасывает ли JVM пустые synchronized-блоки.Нет, результат зависит от того, насколько корректно она их выбрасывает. Корректно.
Нет. Результат зависит от того, а запускается ли код на ai64, ARM-е или POWER.
...
Рейтинг: 0 / 0
02.10.2014, 08:51
    #38764253
buldozer01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка на ночь
А с чего бы вдруг уважающая себя JVM должна выкидывать инструкции являющиеся точками hb ?
Это ж форменный беспредел )))
...
Рейтинг: 0 / 0
02.10.2014, 08:52
    #38764257
buldozer01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка на ночь
Свеном ну твой пример это не доказательство

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

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

В серьезные конторы где JSP и Struts это ругательства конкуренция не столь большая будет))))
...
Рейтинг: 0 / 0
02.10.2014, 10:32
    #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
02.10.2014, 10:38
    #38764404
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка на ночь
buldozer01Результат опроса пока радует))))
В серьезные конторы где JSP и Struts это ругательства конкуренция не столь большая будет))))Ответственно заявляю вам - конкуренции практически нет. Так как нет и большого числа годных разработчиков.
...
Рейтинг: 0 / 0
02.10.2014, 10:41
    #38764415
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка на ночь
no56892а если поток один записал в память 42, но lock еще не получил, в то время как 2й с локом читает?В это случае вы не увидите null в GLOBAL. Тут вопрос только в том, может ли присвоение 42 "убежать" за присвоение GLOBAL. Как показывает анализ исходников Hotspot - не может.
...
Рейтинг: 0 / 0
02.10.2014, 10:54
    #38764433
buldozer01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка на ночь
Свеном такие задачки решаются на языке математики и отношений
В данном случае это SO , HB , PO
...
Рейтинг: 0 / 0
02.10.2014, 11:10
    #38764465
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка на ночь
buldozer01Свеном такие задачки решаются на языке математики и отношений
В данном случае это SO , HB , POЕсли вам нравится мозгодрочка - решайте. Мне это не надо, я вижу data race на автомате. В данном случае все кристально ясно - между выходом из C() и входом в getA() есть HB. Вопрос был только в том, не исчезнет ли это HB при выпиливании пустых критических секций. И, кажется, я дал достаточно убедительный ответ.
...
Рейтинг: 0 / 0
02.10.2014, 11:11
    #38764469
buldozer01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка на ночь
cdtyjvbuldozer01Свеном такие задачки решаются на языке математики и отношений
В данном случае это SO , HB , POЕсли вам нравится мозгодрочка - решайте. Мне это не надо, я вижу data race на автомате. В данном случае все кристально ясно - между выходом из C() и входом в getA() есть HB. Вопрос был только в том, не исчезнет ли это HB при выпиливании пустых критических секций. И, кажется, я дал достаточно убедительный ответ.

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

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

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

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

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

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

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


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