powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Задачка на ночь
18 сообщений из 68, страница 3 из 3
Задачка на ночь
    #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
18 сообщений из 68, страница 3 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / Задачка на ночь
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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