powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Задачка на ночь
68 сообщений из 68, показаны все 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
Задачка на ночь
    #38764562
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv,

Ну тогда не удивляйся что тебя не воспринимают как эксперта и тролят всем форумом
Сейчас в этом диалоге со мной ты явно демонстрируешь свою проф незрелость
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764574
HoBTID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buldozer01, вот расскажите пожалуйста, были ли вам полезны знания тонкостей JMM
(не общие принципы многопоточной работы, типа synchronized, wait, notify, ReentrantLock), а именно тонкости,
типа Happens Before в разных явно не синхронизированных операциях?

Как мне кажется, это все реально нужно только в очень узкоспециализированных задачах,
или чтобы разбираться в говнокоде (или писать говнокод).

А исходный пример, в реальности модифицируется вот так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
final class C {
  private int a;
  
  C() {
    synchronized(this) {
      a = 42;
    }
  }
  
  synchronized int getA() {
    return a;
  }
}



И никаких вопросов больше не возникает.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764579
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buldozer01Ну тогда не удивляйся что тебя не воспринимают как эксперта и тролят всем форумом
Сейчас в этом диалоге со мной ты явно демонстрируешь свою проф незрелостьКоллега, я не имею и никогда не имел своей целью демонстрировать свою проф пригодность на этом форуме. Я демонстрирую ее только в одном месте - на работе. Здесь же я либо помогаю новичкам, либо улучшаю свое настроение.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764584
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HoBTID,

Да мне это было нужно когда я пытался разогнать приложение - чтоб оно пропускало 300.000 запросов в секунду
Каждый syncrhonized блок на счету
Каждый CAS чего то стоит

Нет там где клипают джиспишки это конечно неособо важно
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764586
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv,

Окей Окей )))) Ни в коему случае не хочу Вас в чем то переубеждать
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764588
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HoBTIDbuldozer01, вот расскажите пожалуйста, были ли вам полезны знания тонкостей JMM
(не общие принципы многопоточной работы, типа synchronized, wait, notify, ReentrantLock), а именно тонкости,
типа Happens Before в разных явно не синхронизированных операциях?

Как мне кажется, это все реально нужно только в очень узкоспециализированных задачах,
или чтобы разбираться в говнокоде (или писать говнокод).Так и есть, только в узкоспециализированных задачах. Но дело в том, что такие задачи в России есть как минимум в Москве и Питере, за их решение очень недурно платят, и устроиться в соответствующую контору абсолютно реально.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764589
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buldozer01,

А кто такие эти джедаи? По остальным группам вопрос нет.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764593
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buldozer01HoBTID,

Да мне это было нужно когда я пытался разогнать приложение - чтоб оно пропускало 300.000 запросов в секунду
Каждый syncrhonized блок на счету
Каждый CAS чего то стоитЕсли приведенный вами код не из головы, а из какой-то реальной задачи, то я не понимаю, почему вы не применили final или volatile.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764594
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HoBTIDА исходный пример, в реальности модифицируется вот так:


Мы бы с вами после такой модификации кода не сработались
Если бы Вы были лид и упорно бы перли что синхронайздед блок нужно оставить - вы бы перестали быть для меня авторитетом как профи и я бы уволился чуть позже.

Если бы я был лид - вы либо переучивались бы либо я бы вас уволил.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764600
HoBTID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buldozer01Нет там где клипают джиспишки это конечно неособо важно
Чёрт, у нас не JSP, поновее шаблонизатор выбрали :-)))
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764602
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvbuldozer01HoBTID,

Да мне это было нужно когда я пытался разогнать приложение - чтоб оно пропускало 300.000 запросов в секунду
Каждый syncrhonized блок на счету
Каждый CAS чего то стоитЕсли приведенный вами код не из головы, а из какой-то реальной задачи, то я не понимаю, почему вы не применили final или volatile.

Нет код в задачке не из реальной жизни
Задачка взята с concurrency-interests - где действительно академически грамотные разработчики на языке HB, SO , PO дают доказательство правильного ответа
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764605
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buldozer01Нет там где клипают джиспишки это конечно неособо важно
Это какой-то новый тип ЧСВ? Highload ЧСВ!
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764608
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczbuldozer01Нет там где клипают джиспишки это конечно неособо важно
Это какой-то новый тип ЧСВ? Highload ЧСВ!

Да какое к черту ЧСВ)))) Так вот решил пообщаться с коллегами а вместо этого меня пытаются убедить что говнкодинг это круто и мощно
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764617
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schwabuldozer01,

А кто такие эти джедаи? По остальным группам вопрос нет.

Да щас они везде требуются)))

уяк уяк и в продакшен видимо )))
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764655
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buldozer01Нет код в задачке не из реальной жизни
Задачка взята с concurrency-interests - где действительно академически грамотные разработчики на языке HB, SO , PO дают доказательство правильного ответаА понятно. Вы их портреты уже заказали себе домой на стену?
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764659
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЭто какой-то новый тип ЧСВ? Highload ЧСВ!

Причем у обоих, и они встретились, при этом, у них самое большое количество постов в разделе Работа.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764665
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FDBlazkowiczЭто какой-то новый тип ЧСВ? Highload ЧСВ!

Причем у обоих, и они встретились, при этом, у них самое большое количество постов в разделе Работа.

Ну к сожалению в форуме Java как мы видим не нашлось людей которые бы академически грамотно обосновали свой ответ
Вот и юзаем сруль по назначению
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764669
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvbuldozer01Нет код в задачке не из реальной жизни
Задачка взята с concurrency-interests - где действительно академически грамотные разработчики на языке HB, SO , PO дают доказательство правильного ответаА понятно. Вы их портреты уже заказали себе домой на стену?

Нет я спокойно прочел и внял то что пишут умные люди
Надеялся таких же встретить здесь ))) Но видать не судьба.
Здесь в основном Джедаи и Тролли походу)
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764702
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buldozer01Нет я спокойно прочел и внял то что пишут умные люди
Надеялся таких же встретить здесь ))) Но видать не судьба.
Здесь в основном Джедаи и Тролли походу)Понятно, юношеский максимализм. Прочитали про формальные основы JMM, и теперь считаете, что все, кто их не применяет их от и до в реальной жизни - УГ.
А тем временем Даг Ли работает над новой спецификацией JMM, потому что в текущем виде со всеми этими PO и SO ... она действительно практически неприменима за рамками узкого коммьюнити, которое саму же JMM и разрабатывает.

Когда набьете себе руку в конкаренси, когда все это у вас хорошо уляжется в голове, вы поймете, что в реальной жизни, какие бы сложные прикладные вещи вы не писали, это все нахрен никому не нужно. Все, что я использую из этой теории в практике - HB и freeze файнал полей. Остальное - заумствования которые могут быть нужны только на этапе обучения.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38764704
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvКогда набьете себе руку в конкаренси...

До уровня Джедаев видимо никогда не набью )
...
Рейтинг: 0 / 0
Задачка на ночь
    #38765427
maxkar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А задачка то и правда интересная. Там вопрос в том, можно ли сделать в качестве Synchronization Order сначала getA() а потом уже конструктор. PO этому помешать вроде как не может (он независимо от SO работает). HB - тоже. Остается только causality requirement. Вот не вижу я, где он может помешать закоммитить synchronization() в конструкторе после всего остального кода из примера. Так что и 0 можно увидеть при особом желании.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38765436
maxkar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, блин, я что-то торможу. Нет там 0. Если SO у нас getA() -> ctor, то чтение из global не может увидеть запись туда значения в потоке 1. А если ctor -> getA(), то чтение не может увидеть 0. Поэтому ответ будет {null, 42}.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38765449
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первый сильный пост на 2 страницы говнофлуда )))
Спасибо Вам уважаемый.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38765464
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxkarА, блин, я что-то торможу. Нет там 0. Если SO у нас getA() -> ctor, то чтение из global не может увидеть запись туда значения в потоке 1. А если ctor -> getA(), то чтение не может увидеть 0. Поэтому ответ будет {null, 42}.
Да, там 0 не будет, но только не потому, что 2й поток не увидит 0, а потому, что у него просто не будет ссылки на объект в промежуток времени когда там еще будет 0. Я тож проглядел)
...
Рейтинг: 0 / 0
Задачка на ночь
    #38765566
pavel_nv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892maxkarА, блин, я что-то торможу. Нет там 0. Если SO у нас getA() -> ctor, то чтение из global не может увидеть запись туда значения в потоке 1. А если ctor -> getA(), то чтение не может увидеть 0. Поэтому ответ будет {null, 42}.
Да, там 0 не будет, но только не потому, что 2й поток не увидит 0, а потому, что у него просто не будет ссылки на объект в промежуток времени когда там еще будет 0. Я тож проглядел)
Так вроде бы если ссылка на объект "утекла" в конструкторе, то не гарантируется что другой поток увидит уже установленное значение 42?
...
Рейтинг: 0 / 0
Задачка на ночь
    #38765573
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pavel_nvТак вроде бы если ссылка на объект "утекла" в конструкторе, то не гарантируется что другой поток увидит уже установленное значение 42?В рассматриваемом примере присвоение 42 не может "убежать" из конструктора из-за synchronized-блока.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38765610
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoachВ рассматриваемом примере присвоение 42 не может "убежать" из конструктора из-за synchronized-блока.
Простите по совсем другой причине. И sync блок ну ни как на эту причину не влияет.
Ссылка если может убежать из конструктора, то даже еще до того как он начнется. :)
Но в данном примере она не утекает ибо публикуется не из конструктора, а снаружи и для этого случая sync и является барьером.
Так что если у нас платформа, которая гарантирует, что простое присвоение адреса атомарно - то все пучком.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38765629
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей АрсеньевПростите по совсем другой причине. И sync блок ну ни как на эту причину не влияет.
Ссылка если может убежать из конструктора, то даже еще до того как он начнется. :)Признаться, я не понял, что вы имели ввиду.
Я говорил про следующее. Из-за race conditoin у нас как минимум может быть null и 42. Вопрос заключается только в том, может ли быть 0. Если убрать synchronized(), то он мог бы быть вследствие следующего реордеринга:
Код: java
1.
2.
3.
C c = alloc(C); // 1.
GLOBAL = c; // 2.
c.a = 42; // 3.

Поэтому, если второй поток прочитает значение после шага 2, но до шага 3, то мы получим ноль. И я уже приводил на прошлой странице код, который наглядно это демонстрирует, просто запустите его:
Код: 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.
public class EscapeRunner {

    private static MyClass obj;

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

        final AtomicBoolean stopFlag = new AtomicBoolean();

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

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

                    regularObj.use();
                }
            }
        });

        writer.start();
        reader.start();
    }

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

    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;

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


Если же мы добавим synchronized в конструктор, то такая последовательность становится запрещенной, и теперь код первого потока может отработать только так:
Код: java
1.
2.
3.
4.
5.
C c = alloc(C); // 1.
c.a = 42; // 2.
acquire();
release();
GLOBAL = c; // 3.

Так, шаги 1 и 2 не могут быть переставлены по понятной причине - программа не будет работать. А шаги 2 и 3 не могут быть переставлены из-за acquire-release семантики, которую synchronized() вставляет между ними. Поэтому второй поток никогда не увидит 0.

А вы что имел ввиду?
...
Рейтинг: 0 / 0
Задачка на ночь
    #38765638
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот, максимально упростил код, который воспроизводит этот data race:
Код: 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.
public class Test {
    private static MyClass obj = new MyClass();

    public static void main(String[] args) {
        Thread writer = new Thread(new Runnable() {
            public void run() {
                while (true)
                    obj = new MyClass();
            }
        });

        Thread reader = new Thread(new Runnable() {
            public void run() {
                while (true)
                    obj.use();
            }
        });

        writer.start();
        reader.start();
    }

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

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

        private int use() {
            return obj1.hashCode() + obj2.hashCode();
        }
    }
}

...
Рейтинг: 0 / 0
Задачка на ночь
    #38765683
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoachВот, максимально упростил код, который воспроизводит этот data race

Эхх сколько же этот код на видеx86 должен работать чтоб выстрелило)
...
Рейтинг: 0 / 0
Задачка на ночь
    #38765707
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
buldozer01Эхх сколько же этот код на видеx86 должен работать чтоб выстрелило)Ну вы же в академики метите у нас, и сами ответить не можете?
Сделаю это за вас - свалится этот код на конкретном процессоре, операционке и версии Java станет буквально через доли секунд, когда Java скомпилирует метод конструктор MyClass. Либо она компилирует его с реордерингом, либо нет. Железо напрямую на этот код не влияет. Оно влияет опосредованно - под конкретное железо могут быть или не быть те или иные оптимизации, которые в комплексе приводят к реордерингу сгенерированного JIT-ом кода.
У меня этот код валится на Java7 вплоть до b45 (на более старших не проверял просто), Windows7, Core i5/i7.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38765710
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DEVcoachсвалится этот код или нет на конкретном процессоре, операционке и версии Java станет ясно буквально через доли секунд
...
Рейтинг: 0 / 0
Задачка на ночь
    #38765715
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoachА вы что имел ввиду?

pavel_nv говорил про теоретический случай - " если ссылка на объект "утекла" в конструкторе ".
Что подразумевает публикацию ссылки из конструктора, в том числе и предка. У Вас это не рассматривалось.
Как Вы сами понимаете добавление блоков sync, на эту ситуацию никаким бы образом не повлияло.
О чем я Вам и написал.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38765735
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Арсеньев ,
Все равно не понимаю, какая ссылка и куда утекла. Можете по шагам показать последовательность действий, про которую вы говорите?
...
Рейтинг: 0 / 0
Задачка на ночь
    #38765756
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoachbuldozer01Эхх сколько же этот код на видеx86 должен работать чтоб выстрелило)Ну вы же в академики метите у нас, и сами ответить не можете?
Сделаю это за вас - свалится этот код на конкретном процессоре, операционке и версии Java станет буквально через доли секунд, когда Java скомпилирует метод конструктор MyClass. Либо она компилирует его с реордерингом, либо нет. Железо напрямую на этот код не влияет. Оно влияет опосредованно - под конкретное железо могут быть или не быть те или иные оптимизации, которые в комплексе приводят к реордерингу сгенерированного JIT-ом кода.
У меня этот код валится на Java7 вплоть до b45 (на более старших не проверял просто), Windows7, Core i5/i7.

Да согласен.

У меня вот не получилось добиться того чтобы свалилось
...
Рейтинг: 0 / 0
Задачка на ночь
    #38765759
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoach Сергей Арсеньев ,
Все равно не понимаю, какая ссылка и куда утекла. Можете по шагам показать последовательность действий, про которую вы говорите?
Иногда ссылку на объект может опубликовать сам конструктор. Если это предок Вашего класса, то Ваше hb ему будет фиолетово.

Хотя я вот хоть убей не понимаю - чем эти два блока лучше 1 volatile?
...
Рейтинг: 0 / 0
Задачка на ночь
    #38765762
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тем что у volatile будет
{"null" , 0 , 42}
...
Рейтинг: 0 / 0
Задачка на ночь
    #38765772
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buldozer01,

Если GLOBAL будет volatile?
...
Рейтинг: 0 / 0
Задачка на ночь
    #38765776
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев,

Нет если "a" будет volatile
...
Рейтинг: 0 / 0
Задачка на ночь
    #38765798
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
buldozer01У меня вот не получилось добиться того чтобы свалилосьКак запускаете? Для чистоты эксперимента надо запускать из консоли.
Если вы запускаете из IDE, то может быть у вас компиляция не происходит. Например, если вы запускаете с дебагером, или если ваша IDE запускает код внутри какой-то своей хитрой обертки.
У меня нормально сваливается при запуске из IDEA без дебага.
...
Рейтинг: 0 / 0
Задачка на ночь
    #38765801
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей АрсеньевИногда ссылку на объект может опубликовать сам конструктор. Если это предок Вашего класса, то Ваше hb ему будет фиолетово.Все равно не понимаю, о чем речь. Можете набросать псевдокод?
...
Рейтинг: 0 / 0
Задачка на ночь
    #38765813
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoach,

Код: java
1.
2.
3.
Теоретический_предок_C() {
    GLOBAL=this; // утечка из конструктора
  }
...
Рейтинг: 0 / 0
Задачка на ночь
    #38765828
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Арсеньев ,
Понял, в рассматриваемом коде такой утечки нет.
...
Рейтинг: 0 / 0
68 сообщений из 68, показаны все 3 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Задачка на ночь
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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