Ответ к вопросу про WordTearingTest:
в java word tearing зfпрещен, поэтому данный код может напечатать только один вариант "true-true".
Почитать подробнее можно тут - https://docs.oracle.com/javase/specs/jls/se23/html/jls-17.html (17.6. Word Tearing)
в java word tearing зfпрещен, поэтому данный код может напечатать только один вариант "true-true".
Почитать подробнее можно тут - https://docs.oracle.com/javase/specs/jls/se23/html/jls-17.html (17.6. Word Tearing)
🔥4👍3❤1
Что может напечатать код?
Anonymous Quiz
27%
0;0 и 1;1
14%
0;0 и 1;1 и 0;1
40%
0;0 и 1;1 и 0;1 и 1;0
19%
узнать ответ
🔥4👍2❤1
Ответ на вопрос про IndependenceRead:
Тут неочевидный момент в том, что чтение o1.x и o2.x это два независимых чтения, и JMM не запрещает прочитать их в разном порядке. В отсутствие синхронизации порядок независимых чтений не определен. Код фактически читает одно и то же поле дважды, но компилятор не знает (o1 == o2) (т.е. не проверяет это), поэтому он выдает две независимых загрузки.
Чтение 0;0 1;1 понятны - это чтение до записи обоих полей и после записи.
0;1 - тоже простой вариант - здесь при втором чтение уже запись произошла, а при первом еще нет
1;0 - такой вариант тоже возможен под гонкой так как чтения независимые с точки зрения компилятора он их может переставить.
Для чего нужны строки o1.y = 0; o2.y = 0; ?
Это способ получить эффект независимого чтения, что бы уйти от null-pointer check folding. Теперь компилятору не нужно загружать o1.x и o2.x заранее.
Тут неочевидный момент в том, что чтение o1.x и o2.x это два независимых чтения, и JMM не запрещает прочитать их в разном порядке. В отсутствие синхронизации порядок независимых чтений не определен. Код фактически читает одно и то же поле дважды, но компилятор не знает (o1 == o2) (т.е. не проверяет это), поэтому он выдает две независимых загрузки.
Чтение 0;0 1;1 понятны - это чтение до записи обоих полей и после записи.
0;1 - тоже простой вариант - здесь при втором чтение уже запись произошла, а при первом еще нет
1;0 - такой вариант тоже возможен под гонкой так как чтения независимые с точки зрения компилятора он их может переставить.
Для чего нужны строки o1.y = 0; o2.y = 0; ?
Это способ получить эффект независимого чтения, что бы уйти от null-pointer check folding. Теперь компилятору не нужно загружать o1.x и o2.x заранее.
Telegram
Java Interview Tasks
Что может напечатать код? Методы thread1 и thread2 запускаются одновременно в разных тредах.
Вопрос для экспертов: зачем тут строчки o1.y = 0; и o2.y = 0; ?
Вопрос для экспертов: зачем тут строчки o1.y = 0; и o2.y = 0; ?
🔥9👍8🐳3😱1
Что может напечатать код?
Anonymous Quiz
46%
-1,-1,-1,-1 и 1,2,3,4
16%
только 1,2,3,4
27%
возможны еще другие варианты
11%
узнать ответ
👍11🤔5🔥4😁1
Что может напечатать код?
Anonymous Quiz
36%
-1,-1,-1,-1 и 1,2,3,4
15%
только 1,2,3,4
37%
возможны еще другие варианты
12%
узнать ответ
🔥6👍4🤔4
Ответ к задачам TestFinalConcurrency и TestFinalConcurrency2:
Тут вопросы про инициализацию объекта в конструкторе и final поля.
Fianl поля являются еще одним аспектом модели памяти Java. Они позволяют обеспечить безопасность публикации при гонках. Другими словами, они предоставляют базовую межпотоковую семантику, даже при отсутствии надлежащей синхронизации. Если мы объявим их на всех критических полях, то единственное наблюдаемое состояние — это полностью сконструированный объект.
Другими словами: в коде TestFinalConcurrency2 объявлены все поля final int x1, x2, x3, x4; И поэтому можем увидеть следующие состояния: -1,-1,-1,-1 - объект еще не увидел thread2. 1,2,3,4 - thread2 увидел объект полностью. И других вариантов нет. Невозможно увидеть частично проинициализированный объект. JMM это запрещает.
Теперь если посмотреть на код TestFinalConcurrency, JMM не запрещает увидеть частично созданные объект, поэтому возможны разные варианты (например 1, 0, 3, 4 или 1, 2, 0, 4).
Выводы: Если ваш объект публикуется под гонкой то поля в нем, который инициализируются в конструкторе, должны быть final. Так же важная вещь - не должно быть утечек ссылок на поля объекта из конструктора, иначе так же нет никаких гарантий безопасности. (Про это возможно в будущем найдется задача)
Тут вопросы про инициализацию объекта в конструкторе и final поля.
Fianl поля являются еще одним аспектом модели памяти Java. Они позволяют обеспечить безопасность публикации при гонках. Другими словами, они предоставляют базовую межпотоковую семантику, даже при отсутствии надлежащей синхронизации. Если мы объявим их на всех критических полях, то единственное наблюдаемое состояние — это полностью сконструированный объект.
Другими словами: в коде TestFinalConcurrency2 объявлены все поля final int x1, x2, x3, x4; И поэтому можем увидеть следующие состояния: -1,-1,-1,-1 - объект еще не увидел thread2. 1,2,3,4 - thread2 увидел объект полностью. И других вариантов нет. Невозможно увидеть частично проинициализированный объект. JMM это запрещает.
Теперь если посмотреть на код TestFinalConcurrency, JMM не запрещает увидеть частично созданные объект, поэтому возможны разные варианты (например 1, 0, 3, 4 или 1, 2, 0, 4).
Выводы: Если ваш объект публикуется под гонкой то поля в нем, который инициализируются в конструкторе, должны быть final. Так же важная вещь - не должно быть утечек ссылок на поля объекта из конструктора, иначе так же нет никаких гарантий безопасности. (Про это возможно в будущем найдется задача)
Telegram
Java Interview Tasks
Что может напечатать код?
👍15🔥5🙏2❤1
👍4🔥2👌1
👍7❤2🔥2😁1
Ответ на задачи про DoubleRead и BenignRace:
Устоявшиеся семантики при доступе к совместно используемым данным с возможными конфликтами позволяют создавать примеры, где объекты публикуются без проблем через гонку. Это состояние известно как "безопасная гонка" ("benign race"). Оно обычно выглядит следующим образом:
T get() {
T t = instance; // 1: ОДНО неоднозначное чтение
if (t == null) {
t = new T(...); // 2: БЕЗОПАСНОЕ, ИДЕМПОТЕНТНОЕ создание
instance = t; // запись с гонкой
}
return t;
}
Механизм этой безопасной гонки понятен: если мы что-то читаем, мы читаем это полностью, потому что семантика финальных полей защищает нас (смотри вопросы про TestFinalConcurrency и TestFinalConcurrency2 ). Если мы читаем null, то можем это исправить, создавая экземпляр самостоятельно и сохраняя его для будущих вызовов. Поскольку может произойти гонка записи, важно, чтобы создание объекта было идемпотентным, то есть независимо от того, сколько потоков инициализируют объект, все они сохранят семантически идентичный объект.
Дополнительная сложность, предписанная моделью памяти Java (JMM), заключается в необходимости одноразового чтения. Если мы прочитаем поле instance один раз, выясним, что оно не равно null, а затем прочитаем его снова, мы можем получить null при втором чтении!
Устоявшиеся семантики при доступе к совместно используемым данным с возможными конфликтами позволяют создавать примеры, где объекты публикуются без проблем через гонку. Это состояние известно как "безопасная гонка" ("benign race"). Оно обычно выглядит следующим образом:
T get() {
T t = instance; // 1: ОДНО неоднозначное чтение
if (t == null) {
t = new T(...); // 2: БЕЗОПАСНОЕ, ИДЕМПОТЕНТНОЕ создание
instance = t; // запись с гонкой
}
return t;
}
Механизм этой безопасной гонки понятен: если мы что-то читаем, мы читаем это полностью, потому что семантика финальных полей защищает нас (смотри вопросы про TestFinalConcurrency и TestFinalConcurrency2 ). Если мы читаем null, то можем это исправить, создавая экземпляр самостоятельно и сохраняя его для будущих вызовов. Поскольку может произойти гонка записи, важно, чтобы создание объекта было идемпотентным, то есть независимо от того, сколько потоков инициализируют объект, все они сохранят семантически идентичный объект.
Дополнительная сложность, предписанная моделью памяти Java (JMM), заключается в необходимости одноразового чтения. Если мы прочитаем поле instance один раз, выясним, что оно не равно null, а затем прочитаем его снова, мы можем получить null при втором чтении!
Telegram
Java Interview Tasks
Что может напечатать код?
Методы actor1, actor2 и eraser вызываются одновременно в параллельных потоках
Методы actor1, actor2 и eraser вызываются одновременно в параллельных потоках
👍7🔥3🤔2
#реклама
Привет, коллеги! А вы знаете, что митапы в IT — это не просто тусовка, а мощный рывок для роста?
Здесь можно:
— Найти работу — HRы и тимлиды ищут таланты прямо в кулуарах.
— Прокачать скиллы — доклады от практиков, а не теория из учебников.
— Завести полезные знакомства — нетворкинг круче, чем LinkedIn
— Вдохновиться — после митапа хочется кодить, а не залипать в Netflix.
В нашем tg канале Митапочная:
— Только соль: анонсы ближайших митапов без воды
— Четко, коротко, по делу: тема + дата + ссылка на регистрацию
— Никакого спама — только то, что действительно стоит твоего времени
Главное в IT — не только код, но и люди вокруг. Присоединяйся! 🚀
Привет, коллеги! А вы знаете, что митапы в IT — это не просто тусовка, а мощный рывок для роста?
Здесь можно:
— Найти работу — HRы и тимлиды ищут таланты прямо в кулуарах.
— Прокачать скиллы — доклады от практиков, а не теория из учебников.
— Завести полезные знакомства — нетворкинг круче, чем LinkedIn
— Вдохновиться — после митапа хочется кодить, а не залипать в Netflix.
В нашем tg канале Митапочная:
— Только соль: анонсы ближайших митапов без воды
— Четко, коротко, по делу: тема + дата + ссылка на регистрацию
— Никакого спама — только то, что действительно стоит твоего времени
Главное в IT — не только код, но и люди вокруг. Присоединяйся! 🚀
👍7🔥1
Полезный доклад про рекурсию:
https://youtu.be/VAUQVmPMiYw?si=2l0A071vhTnFjWQN
https://youtu.be/VAUQVmPMiYw?si=2l0A071vhTnFjWQN
YouTube
Максим Сидоров — Как избавиться от рекурсии и исправить глупую ошибку в Google
Подробнее о Java-конференциях:
— весной — JPoint: https://jrg.su/gTrwHx
— осенью — Joker: https://jrg.su/h7yvG4
— —
Скачать презентацию с сайта JPoint — https://jrg.su/SbBUTL
Спикер рассказал про исследование различных подходов к оптимизации рекурсии. Рассмотрел…
— весной — JPoint: https://jrg.su/gTrwHx
— осенью — Joker: https://jrg.su/h7yvG4
— —
Скачать презентацию с сайта JPoint — https://jrg.su/SbBUTL
Спикер рассказал про исследование различных подходов к оптимизации рекурсии. Рассмотрел…
👍3🔥2❤1
Что напечатает код?
Anonymous Quiz
31%
"123"
31%
"456"
3%
"123456"
4%
будет exception
28%
будет ошибка компиляции
4%
узнать ответ
🔥6👍2😁1😱1
Ответ на вопрос про нестатический блок инициализации: здесь пример неочевидной опережающей инициализации поля, такой синтаксис в джаве разрешен, внутри блока инициализации s будет равно "456", но значение поля будет переопределено в строке 15, поэтому ответ "123".
Telegram
Java Interview Tasks
Что напечатает код?
👍10❤1🔥1
Что напечатает код?
Anonymous Quiz
5%
true, true, true
33%
false, true, true
10%
false, false, true
43%
false, false, false
4%
другой вариант
5%
узнать результаты
👍7🔥2😁1