Java Interview Tasks
3.9K subscribers
185 photos
1 file
121 links
Реальные вопросы и задачи с собеседований.
Оригинальный авторский контент.
Актуальный материал.
Уровень вопросов от junior до supersenior.

Автор канала - @alexzelentsov

По рекламе: @alexzelentsov и https://telega.in/c/java_interview_tasks
Download Telegram
Оцените по 10-ти бальной шкале Set
Anonymous Poll
33%
1
6%
2
8%
3
8%
4
19%
5
5%
6
11%
7
7%
8
5%
9
33%
10
Итак, месяц май объявляется месяцем "проверки многопоточного кода". Впереди вас ждут задания на тему многопоточности.
👍6🔥21
Вопрос: может ли метод spin() не завершить свою работу, даже если метод stop() был вызван?
👍8🔥1🙏1
Вопрос: может ли метод spin() не завершить свою работу, даже если метод stop() был вызван?
Anonymous Quiz
74%
да, может зависнуть
19%
нет, всегда завершится
7%
узнать ответ
👍5🔥1🤔1
Ответ на задачу на SpinTest:
Здесь приведен известный пример с зависанием цикла.
Можно ожидать, что записи в переменные в конечном итоге будут видны. Однако, согласно модели памяти Java, это не относится к чтениям и записям в поля без многопоточной семантики.
Компилятор с оптимизацией может проверить поле ready один раз, и если оно "false", сократить остальную часть цикла до "while(true)", получив бесконечный цикл.
Как можно избежать данной проблемы?
Самым правильным вариантом в данном коде будет добавление ключевого слова volatile для поля ready, таким образом мы гарантируем достижение видимости изменения поля. Все записи в volatile поля становятся видимыми в конечном итоге (eventually visible), поэтому цикл в конечном итоге завершится.
👍9🔥4🙏1
Вопрос: что напечатает метод read?
🔥4👍2🤔1
Ответ к SimpleDataRace:
Тут есть конфликт: запись и чтение, одно и то же место без какой-либо синхронизации. Это состояние гонки (data race), по определению.
Состояние при котором печатается "null" легко объяснить когда запись идет после чтения. но в данном примере важно другое, "npe" состояние невозможно, это запрещено JMM. Даже при наличии гонок, поведение программы разумное. Конкретно здесь мы публикуем объект через гонку, но даже тогда объект имеет все метаданные, поэтому мы можем запрашивать классы, вызывать методы, получать доступ к полям.
Убрать состояние гонки в данном случае легко - достаточно добавить синхронизацию на поел obj. (например добавить volatile)
👍8🔥2👌1
Знакомо ли вам понятие "word tearing" ?
Anonymous Quiz
15%
да
85%
нет
🔥3👍2👏1
Word tearing означает, что доступ к конкретному логическому полю может аффектить соседние поля. Например, если вы меняете первый элемент массива, и при этом меняется и второй элемент тоже.
🔥6😱3👍2👎1
Что может напечатать код? Под этим кодом подразумевается фундаментальный вопрос - разрешен ли word tearing в java?
🔥5👍2
Всем привет! Меня Влад зовут и я разработчик уже целых 8 лет. Последние 2 года работал в компании Uber в Амстердаме, а начинал, кстати, с полного нуля — обычным парнем из деревни.

Если ты мечтаешь попасть в IT, круто зарабатывать и гордиться собой, но не веришь, что это вообще реально — я прекрасно тебя понимаю.

Ты читаешь телеграм-каналы, смотришь ролики на YouTube, и все равно в голове бардак: слишком много всего, а что реально важно — не понятно. Кажется, без специального образования никуда, а страх бросить все на полпути только усиливается.

Поверь, это абсолютно нормально. Я прошел ровно через то же самое и знаю, как помочь тебе не потеряться в море информации и сомнений.

У меня есть решение — четкий и понятный план, как с нуля построить карьеру разработчика и не бросить на полпути, отказавшись от мечты.

Расскажу, с чего начать, как не сдаться и как стать разработчиком, даже если этот путь кажется сложным и нереальным.

Приходи на бесплатный вебинар — “Как начать зарабатывать 200 000₽ в IT за 6 месяцев: путь от нуля до первой работы.

ЗАПИСАТЬСЯ НА ВЕБИНАР
🤡225👎2
Ответ к вопросу про WordTearingTest:
в java word tearing зfпрещен, поэтому данный код может напечатать только один вариант "true-true".
Почитать подробнее можно тут - https://docs.oracle.com/javase/specs/jls/se23/html/jls-17.html (17.6. Word Tearing)
🔥4👍31
Что может напечатать код? Методы thread1 и thread2 запускаются одновременно в разных тредах.
Вопрос для экспертов: зачем тут строчки o1.y = 0; и o2.y = 0; ?
👍5🔥1👏1
🔥4👍21
Ответ на вопрос про 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 заранее.
🔥9👍8🐳3😱1
Что может напечатать код?
👍8🔥3🤔3
👍11🤔5🔥4😁1
Что может напечатать код?
👍62🔥2
🔥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. Так же важная вещь - не должно быть утечек ссылок на поля объекта из конструктора, иначе так же нет никаких гарантий безопасности. (Про это возможно в будущем найдется задача)
👍15🔥5🙏21