Что такое ordering, as-if-serial semantics, sequential consistency, visibility, atomicity, happens-before, mutual exclusion, safe publication?
ordering механизм, который определяет, когда один поток может увидеть out-of-order
(неверный) порядок исполнения инструкций другого потока. CPU
для для повышения производительности может переупорядочивать процессорные инструкции и выполнять их в произвольном порядке до тех пор пока для потока внутри не будет видно никаких отличий. Гарантия, предоставляемая этим механизмом, называется as-if-serial semantics
.
sequential consistency - то же что и as-if-serial semantics
, гарантия того, что в рамках одного потока побочные эффекты от всех операций будут такие, как будто все операции выполняются последовательно.
visibility определяет, когда действия в одном потоке становятся видны из другого потока.
happens-before - логическое ограничение на порядок выполнения инструкций программы. Если указывается, что запись в переменную и последующее ее чтение связаны через эту зависимость, то как бы при выполнении не переупорядочивались инструкции, в момент чтения все связанные с процессом записи результаты уже зафиксированы и видны.
atomicity — атомарность операций. Атомарная операция выглядит единой и неделимой командой процессора, которая может быть или уже выполненной или ещё невыполненной.
mutual exclusion (взаимоисключающая блокировка, семафор с одним состоянием) - механизм, гарантирующий потоку исключительный доступ к ресурсу. Используется для предотвращения одновременного доступа к общему ресурсу. В каждый момент времени таким ресурсом может владеть только один поток. Простейший пример: synchronized(obj) { … }
.
safe publication? - показ объектов другим потокам из текущего, не нарушая ограничений visibility
. Способы такой публикации в Java
:
• static{}
инициализатор;
• volatile
переменные;
• atomic
переменные;
• сохранение в разделяемой переменной, корректно защищенной с использованием synchronized()
, синхронизаторов или других конструкций, создающих read/write memory barrier
;
• final
переменные в разделяемом объекте, который был корректно проинициализирован.
Чем отличается процесс от потока?
Процесс — экземпляр программы во время выполнения, независимый объект, которому выделены системные ресурсы (например, процессорное время и память). Каждый процесс выполняется в отдельном адресном пространстве: один процесс не может получить доступ к переменным и структурам данных другого. Если процесс хочет получить доступ к чужим ресурсам, необходимо использовать межпроцессное взаимодействие. Это могут быть конвейеры, файлы, каналы связи между компьютерами и многое другое.
Для каждого процесса ОС создает так называемое «виртуальное адресное пространство», к которому процесс имеет прямой доступ. Это пространство принадлежит процессу, содержит только его данные и находится в полном его распоряжении. Операционная система же отвечает за то, как виртуальное пространство процесса проецируется на физическую память.
Поток(thread) — определенный способ выполнения процесса, определяющий последовательность исполнения кода в процессе. Потоки всегда создаются в контексте какого-либо процесса, и вся их жизнь проходит только в его границах. Потоки могут исполнять один и тот же код и манипулировать одними и теми же данными, а также совместно использовать описатели объектов ядра, поскольку таблица описателей создается не в отдельных потоках, а в процессах. Так как потоки расходуют существенно меньше ресурсов, чем процессы, в процессе выполнения работы выгоднее создавать дополнительные потоки и избегать создания новых процессов.
Какие логические операции и операторы вы знаете?
• &
: Логическое AND (И);
• &&
: Сокращённое AND;
• |
: Логическое OR (ИЛИ);
• ||
: Сокращённое OR;
• ^
: Логическое XOR (исключающее OR (ИЛИ));
• !
: Логическое унарное NOT (НЕ);
• &=
: AND с присваиванием;
• |=
: OR с присваиванием;
• ^=
: XOR с присваиванием;
• ==
: Равно;
• !=
: Не равно;
• ?:
: Тернарный (троичный) условный оператор.
Что такое класс Object? Какие в нем есть методы?Object
это базовый класс для всех остальных объектов в Java. Любой класс наследуется от Object
и, соответственно, наследуют его методы:public boolean equals(Object obj)
– служит для сравнения объектов по значению;int hashCode()
– возвращает hash код для объекта;String toString()
– возвращает строковое представление объекта;Class getClass()
– возвращает класс объекта во время выполнения;protected Object clone()
– создает и возвращает копию объекта;void notify()
– возобновляет поток, ожидающий монитор;void notifyAll()
– возобновляет все потоки, ожидающие монитор;void wait()
– остановка вызвавшего метод потока до момента пока другой поток не вызовет метод notify()
или notifyAll()
для этого объекта;void wait(long timeout)
– остановка вызвавшего метод потока на определённое время или пока другой поток не вызовет метод notify()
или notifyAll()
для этого объекта;void wait(long timeout, int nanos)
– остановка вызвавшего метод потока на определённое время или пока другой поток не вызовет метод notify()
или notifyAll()
для этого объекта;protected void finalize()
– может вызываться сборщиком мусора в момент удаления объекта при сборке мусора.
💪 Пройди тест по Java и проверь свои знания.
Ответишь — пройдешь на продвинутый курс "Java Developer. Professional" от OTUS по специальной цене + получишь запись мастер-класса от преподавателя курса🎁 .
✍️ ПРОЙТИ ТЕСТ: https://otus.pw/C3DC/Реклама. Информация о рекламодателе на сайте otus.ru
Открой для себя лучший способ найти работу на удаленке или в офисе: подпишись на Java Job
Здесь вы найдете:
➡️ Вакансии от ведущих IT-компаний (таких как Яндекс, Сбербанк, Intel)
➡️ Вакансии стартапов, которые не представлены на других сайтах;
➡️ Предложения от зарубежных компаний с возможностью релокации;
➡️ Стажировки и обучающие материалы для карьерного роста
Цени свое время - подпишись на @Java_Job
☕️ Учимся работать с камерой на Java
Мини-урок по тому, как на Java написать простенькое приложение, которое будет получать доступ к камере устройства, делать несколько снимков, обрабатывать их в реальном времени и выводить на экран пользователя.
Если вы только начинаете знакомиться с Java и уже приближаетесь к тому, чтобы написать какое-то осмысленное приложение, то это видео точно рекомендовано к просмотру.
https://youtu.be/JodGfWIzMws
Как продавать свои услуги и продукты в Telegram на 100-тни тысяч рублей?
Не важно в какой нише ты работаешь. Будь ты таргетолог, маркетолог, фитнес-тренер, йога-терапевт, писатель или спец по тестированию матрасов.
Ты можешь стабильно получать деньги в ТГ. Например, мы создали канал, где просто пишем +/- одинаковые посты и каждый день 30-40к падают на карту 💳
Мы протестировали свою схему на учениках. За 4 недели они заработали 44 млн ₽ (с каналами от 123 подписчиков). Большинство вообще не знали о чем писать и что продавать.
Сейчас в канале выбираем новичка, который по нашей схеме заработает первые 100-500 тысяч в ТГ с 0 без денег на рекламу.
📌Все шаги схемы – цифры, подробности, лайфхаки, ты сможешь наблюдать в формате реалити шоу.
Смотри. Повторяй. Зарабатывай.
Заходи бесплатно в реалити по ссылке:
✅ /channel/+hSwl8c3JQ7EyMjMy
📌Если герой не заработает денег, то мы отправим на Бали случайного подписчика. Ты с нами? Жми👇
Стартануть в IT быстро и эффективно — подготовительный курс по Java-разработке.
Всего 990 ₽ и ваше жгучее желание начать. Приходите с любым бэкграундом: нам не важны возраст, пол, образование и текущая профессия.
🗓 Начинаем 18 апреля!
Даем: 62 урока с практикой в браузере, 3 онлайн вебинара и 1 сессию лайвкодинга с практикующим разработчиком.
Получаем: крепкие знания базы языка, умение понимать код и первую программу на Java, написанную вместе с наставником.
🔜 Запишитесь прямо сейчас!
#вопросы_с_собеседований
Что такое пакет? Перечислите различные преимущества пакетов.
Пакеты — это набор связанных классов и интерфейсов, которые связаны вместе. Используя пакеты, разработчики могут легко модулировать код и оптимизировать его повторное использование. Кроме того, код внутри пакетов может быть импортирован другими классами и использован повторно. Несколько его преимуществ:
• Пакеты на Java помогают избежать конфликтов имен.
• Они обеспечивают более легкий контроль доступа к коду.
• Пакеты также могут содержать скрытые классы, которые не видны внешним классам и используются только внутри пакета..
• Создает правильную иерархическую структуру, которая упрощает поиск связанных классов.
#вопросы_с_собеседований
Где разрешена инициализация статических/нестатических полей?
☕️ Статические поля можно инициализировать при объявлении, в статическом или нестатическом блоке инициализации.
☕️ Нестатические поля можно инициализировать при объявлении, в нестатическом блоке инициализации или в конструкторе.
#вопросы_с_собеседований
Скомпилируется ли код с картинки?
Да. При цепочке исключений компилятор заботится только о первом в цепочке, и, поскольку он обнаруживает непроверяемое исключение, не нужно добавлять throws.
👨💻4 способа прокачать свою карьеру в IT и попасть в Яндекс
1️⃣Летние школы Академии Яндекса
Для тех, у кого уже есть опыт в разработке. До 27 апреля продолжается набор в Школу бэкенд-разработки (Python, Java, C++, Go), Школу мобильной разработки (iOS, Android, Flutter), Школу разработки интерфейсов и Школу менеджеров. Обучение бесплатное. Иногородним Яндекс оплатит билеты и проживание на период практики в офисах компании в Москве, Алматы и Белграде. Лучшим студентам — офер в штат Яндекса.
2️⃣Открытый лекторий Академии Яндекса
Если нет времени на Школы, регистрируйтесь на бесплатный Открытый лекторий. Это часть программы Летних школ — 120 лекций по soft skills, бэкенд-, фронтенд- и мобильной разработке, аналитике и продакт-менеджменту.
3️⃣Стажировки по бэкенд-, фронтенд- и мобильной разработке, data science и ML
Получите опыт работы над продуктами, которыми пользуются миллионы. Подайте заявку на оплачиваемую стажировку (от 3 до 6 месяцев). Расходы на проживание и билеты для иногородних студентов Яндекс берет на себя.
4️⃣Intern Meetup Week и пробные собеседования
Серия открытых митапов для начинающих разработчиков. В программе — лекции экспертов о технологиях, общение с руководителями команд и пробное собеседование на стажировку. Митап пройдет в онлайне и офлайне c 17 по 20 апреля. Регистрируйтесь до 12 апреля!
Удачи!😎
#вопросы_с_собеседований
Что такое «зелёные потоки» и есть ли они в Java?Зелёные (легковесные) потоки(green threads)
- потоки эмулируемые виртуальной машиной или средой исполнения. Создание зелёного потока не подразумевает под собой создание реального потока ОС.
Виртуальная машина Java
берёт на себя заботу о переключении между разными green threads
, а сама машина работает как один поток ОС
. Это даёт несколько преимуществ. Потоки ОС
относительно дороги в большинстве POSIX-систем
. Кроме того, переключение между native threads
гораздо медленнее, чем между green threads
.
Это всё означает, что в некоторых ситуациях green threads гораздо выгоднее, чем native threads
. Система может поддерживать гораздо большее количество green threads
, чем потоков OС
. Например, гораздо практичнее запускать новый green thread
для нового HTTP-соединения
к веб-серверу, вместо создания нового native thread
.
Однако есть и недостатки. Самый большой заключается в том, что вы не можете исполнять два потока одновременно. Поскольку существует только один native thread
, только он и вызывается планировщиком ОС
. Даже если у вас несколько процессоров и несколько green threads
, только один процессор может вызывать green thread
. И всё потому, что с точки зрения планировщика заданий ОС
всё это выглядит одним потоком.
Начиная с версии 1.2 Java
поддерживает native threads
, и с тех пор они используются по умолчанию.
🔥 Пройдите тест по Kotlin из 10 вопросов и проверьте, насколько вы готовы к обучению на онлайн-курсе "Kotlin Backend Developer" от OTUS. Курс доступен в рассрочку.
На курсе вы:
👉 Освоите практики гибкой архитектуры и сможете применять их в проектах на любых языках
👉 Откроете для себя широкий спектр технологий и инструментов разработки (около 10 различных фреймворков)
👉 Изучите Kotlin на высоком уровне, включая DSL, мультиплатформенность, корутины
👉 Погрузитесь в темы высокой нагрузки, больших данных, масштабируемости и высокой доступности
👉 Освоите классические и передовые архитектурные шаблоны
❗️ ПРОЙТИ ТЕСТ — https://otus.pw/WBTz/
💣 Сможете пройти успешно тест — бонусом получите курс по GIT в записи бесплатно + доступ к 2 открытым урокам курса!
Нативная интеграция. Информация о продукте www.otus.ru
Ребят, хватит спамить мне в лс по поводу безлимитных запросов к MidJourney-5.
Оставляю ссылку на официальный канал, где она доступна бесплатно без лимитов вместе с ChatGPT: @midjourney5
💻 Создание многопоточного клиент-серверного приложения на Java
В этом видео преподаватель пишет сервер на языке Java и простой клиент, которые передают информацию друг другу с помощью сокетов.
Смотреть на YouTube
♻️ Какими должны быть классы по Clean Code
В ролике подробно рассказано, как правильно создавать классы по парадигмам из книги Чистый код. Автору видео удалось разъяснить тему ещё лучше, чем в переводе книги.
Смотреть на YouTube
🧠 MVC, MVP, MVVM
Уверены, вы уже слышали про эти странные слова, но не совсем понимали, что они значат. Это видео призвано ответить на все ваши вопросы.
Автор на примерах показывает различия между этими паттернами и объясняет, когда какой использовать. Всё написано на языке Java.
https://youtu.be/HC33Mggec3k
Что такое ThreadLocal-переменная?ThreadLocal
- класс, позволяющий имея одну переменную, иметь различное её значение для каждого из потоков.
У каждого потока - т.е. экземпляра класса Thread
- есть ассоциированная с ним таблица ThreadLocal-переменных
. Ключами таблицы являются cсылки на объекты класса ThreadLocal
, а значениями - ссылки на объекты, «захваченные» ThreadLocal-переменными
, т.е. ThreadLocal-переменные
отличаются от обычных переменных тем, что у каждого потока свой собственный, индивидуально инициализируемый экземпляр переменной. Доступ к значению можно получить через методы get()
или set()
.
Например, если мы объявим ThreadLocal-переменную
: ThreadLocal<Object> locals = new ThreadLocal<Object>();
. А затем, в потоке, сделаем locals.set(myObject)
, то ключом таблицы будет ссылка на объект locals
, а значением - ссылка на объект myObject
. При этом для другого потока существует возможность «положить» внутрь locals
другое значение.
Следует обратить внимание, что ThreadLocal
изолирует именно ссылки на объекты, а не сами объекты. Если изолированные внутри потоков ссылки ведут на один и тот же объект, то возможны коллизии.
Так же важно отметить, что т.к. ThreadLocal-переменные
изолированы в потоках, то инициализация такой переменной должна происходить в том же потоке, в котором она будет использоваться. Ошибкой является инициализация такой переменной (вызов метода set()
) в главном потоке приложения, потому как в данном случае значение, переданное в методе set()
, будет «захвачено» для главного потока, и при вызове метода get()
в целевом потоке будет возвращен null
.
Проверяем наличие дубликатов в массиве в Java
Мы можем работать лучше, используя Хеширование. Идея состоит в том, чтобы пройти по заданному массиву и вставить каждый встреченный элемент в HashSet. Теперь, если встреченный элемент уже присутствовал в наборе, он является дубликатом. Временная сложность этого решения O(n) но вспомогательное пространство используется O(n).
Мы знаем это HashSet не допускает дублирования значений в нем. Мы можем использовать это свойство для проверки дубликатов в массиве. Идея состоит в том, чтобы вставить все элементы массива в HashSet. Теперь массив содержит дубликат, если длина массива не равна размеру набора.
Другие способы проверить массив на дубликаты можно найти здесь.
Метод compareTo()
В Java метод compareTo() получает значение 0, если аргумент является строкой лексически равной данной строке; значение меньше 0, если аргумент является строкой лексически большей, чем сравниваемая строка; и значение больше 0, если аргумент является строкой лексически меньшей этой строки.
Готовы освоить Best Practice по разработке микросервисной архитектуры и сложных отказоустойчивых систем? Сделайте первые шаги на открытом уроке «Модульные монолиты и DDD» 🗓 17 апреля в 20:00 мск в OTUS.
На занятии вместе со Станиславом Щетинниковым, директором разработки с 10-летним опытом, рассмотрим основные паттерны для построения и написания модульных монолитов. Особое внимание будет уделено паттернам DDD.
👨💻 Занятие будет полезно для back-end разработчикам, тимлидам и администраторам.
👉 Для регистрации на урок пройдите вступительное тестирование — https://otus.pw/JuRj/
А если вам понравятся бесплатные уроки, продолжить обучение можно будет уже на курсе «Microservice architecture» от OTUS. Оплата курса возможна в рассрочку.
Реклама. Информация о рекламодателе на сайте www.otus.ru
Обычно разработчиков зовут работать, а тут внезапно предлагают отдохнуть. Финтех Яндекса проводит закрытую вечеринку, где можно и в квиз сыграть, и поболтать про стек технологий. Ребята поделятся планами на будущее и покажут, как это вообще — быть частью Финтеха.
Идея интересная: на вечеринке можно оценить атмосферу и офис, познакомиться с коллегами и сразу понять, будут ли они смеяться над твоими шутками. Заодно встретишься с тимлидом и оценишь размер синяков у него под глазами (если что, чем меньше — тем лучше). И если всё понравится — можно вернуться снова, но уже как часть команды.
Вечеринка пройдёт в московском офисе Яндекса. Чтобы получить инвайт, даже собеседования не нужны — достаточно решить задачи →
class Coding game TONight:
def __init__(Write code, Have fun, Earn crypto):
self.Write code = Пиши код
self.Have fun = Развлекайся
self.Earn crypto = Зарабатывай криптовалюту
print(Вы просыпаетесь 19 января 2038 года и понимаете, что мир кардинально изменился. Жителям нужна помощь того, кто знает Python, Javascript, Java и т.д. и они датут ревард в TON)
Перейдите по ссылке и начните игру прямо сейчас:
👉 https://clck.ru/347Yn7
#вопросы_с_собеседований
В чем разница между перегрузкой и переопределением чего-либо?
Переопределение выполняется во время работы программы, а перегрузка — во время компиляции. Также переопределение и перегрузка выполняются по-разному: в Java перегружаемый метод должен иметь отличную от оригинального метода сигнатуру, а в случае с переопределением она может быть той же самой.
Что такое маркерный интерфейс? Каковы известные примеры таких интерфейсов в Java?
Маркерный интерфейс — это интерфейс без каких-либо методов. Обычно он реализуется классом или расширяется другим интерфейсом для обозначения определенного свойства. Наиболее широко известными маркерами в стандартной библиотеке Java являются следующие:☕️ Serializable
используется для явного указания того, что этот класс может быть сериализован;☕️ Cloneable
позволяет клонировать объекты с помощью метода clone (без интерфейса Cloneable этот метод выдает исключение CloneNotSupportedException);☕️ Remote
используется в RMI для указания интерфейса, методы которого можно вызывать удаленно.
🇬🇧 Реально ли IT-специалисту переехать в Великобританию без предложения о работе, без высшего образования и без знания английского языка? Ответ: да! Рассказываем, как это сделать.
Виза Global Talent дала возможность более 8000 IT-специалистам переехать в Британию в 2022 году. Она выдаётся на срок до 5 лет, по ней можно работать в любой компании, фрилансить и открывать собственный бизнес.
Чтобы получить эту визу, не обязательно иметь высшее образование, не нужно знать язык на высоком уровне, а заявку можно подать из любой страны. И, пожалуй, самое главное – не нужно обладать исключительным талантом! Очень многие IT-специалисты могут претендовать на эту визу.
Подписывайтесь на наш Telegram-канал, где мы даём массу полезной информации о релокации: /channel/relocode
Пишите нам в Telegram: @relocode_dm. Мы проводим бесплатные консультации, на которых поможем разобрать ваш кейс и подобрать наиболее подходящий способ релокации.