Как стать профессиональным хакером и тестировать системы и продукты компаний на прочность?
Команда практикующих пентестеров HackerU разработала программу обучения, где 80% практики и 100% поддержки от менторов обеспечат старт в профессии «Специалист по тестированию на проникновение».
По окончанию курса вас ждёт: получение диплома о проф. переподготовке, 2500+ открытых вакансий и проектов по кибербезопасности, карьерная поддержка от HackerU в лице экспертов и HR, а также доход уже на старте от 80к в месяц!
Хотите начать прямо сейчас? Мы ждём всех на бесплатной консультации с экспертом-пентестером, в которую входит:
— разбор roadmap по профессиям в ИБ
— первые задачи в формате киберсоревнований CTF
— тестирование, определяющее точку вашего старта
— и ответы на ваши вопросы от эксперта
Пройдите бесплатную консультацию с экспертом и зафиксируйте стоимость курса со скидкой в 30%!
Регистрируйтесь на консультацию по ссылке: https://is.gd/8Ybh2u
Команда практикующих пентестеров HackerU разработала программу обучения, где 80% практики и 100% поддержки от менторов обеспечат старт в профессии «Специалист по тестированию на проникновение».
По окончанию курса вас ждёт: получение диплома о проф. переподготовке, 2500+ открытых вакансий и проектов по кибербезопасности, карьерная поддержка от HackerU в лице экспертов и HR, а также доход уже на старте от 80к в месяц!
Хотите начать прямо сейчас? Мы ждём всех на бесплатной консультации с экспертом-пентестером, в которую входит:
— разбор roadmap по профессиям в ИБ
— первые задачи в формате киберсоревнований CTF
— тестирование, определяющее точку вашего старта
— и ответы на ваши вопросы от эксперта
Пройдите бесплатную консультацию с экспертом и зафиксируйте стоимость курса со скидкой в 30%!
Регистрируйтесь на консультацию по ссылке: https://is.gd/8Ybh2u
#вопросы_с_собеседований
Что такое ReadWriteLock?
Что такое ReadWriteLock?
ReadWriteLock – это интерфейс расширяющий базовый интерфейс Lock. Используется для улучшения производительности в многопоточном процессе и оперирует парой связанных блокировок (одна - для операций чтения, другая - для записи). Блокировка чтения может удерживаться одновременно несколькими читающими потоками, до тех пор пока не появится записывающий. Блокировка записи является эксклюзивной.
Существует реализующий интерфейс ReadWriteLock класс ReentrantReadWriteLock, который поддерживает до 65535 блокировок записи и до стольки же блокировок чтения.
Существует реализующий интерфейс ReadWriteLock класс ReentrantReadWriteLock, который поддерживает до 65535 блокировок записи и до стольки же блокировок чтения.
ReadWriteLock rwLock = new ReentrantReadWriteLock();
Lock rLock = rwLock.readLock();
Lock wLock = rwLock.writeLock();
wLock.lock();
try {
// exclusive write
} finally {
wLock.unlock();
}
rLock.lock();
try {
// shared reading
} finally {
rLock.unlock();
}
Forwarded from Java jobs — вакансии для java-разработчиков
#вакансия #Москва #Мск #удаленно #удаленнаяработа #Middle #Java
💻 Компания: Payneteasy
https://payneteasy.ru/
👨🏻💻👩🏻💻 Java разработчик (Middle/Regular)
🔺 Формат работы: Удаленная работа Full-time либо в нашем супер - офисе на Октябрьском поле
🔺 Занятость: полный рабочий день (гибкое начало дня, по 8 часов, 5/2)
💸 ЗП: от 180.000₽
📱 Контакты: HR Ксения: [email protected] или в личные сообщения ТГ @donnyjet (Отвечу на все вопросы!)
🔺Условия работы:
• Полная занятость;
• Высокопрофессиональный коллектив и много новых, инновационных и динамичных проектов
• Возможность профессионального и карьерного роста;
• Гибкий график работы
• Возможность работать из любой точки планеты или в комфортном офисе на Октябрьском поле
🔺Требования к кандидату:
• Опыт разработки на языке Java (от 3 лет);
• уверенное знание Java SE:
• Collections, I/O, Exceptions, GC, Generics
• Multithreading (synchronization, JMM, java.util.concurrent)
• Опыт работы Java EE:
• Servlet API
• JPA
• Знание и опыт использования Spring, NoSQL DB(Cassandra), SQL DB (MySQL, PostgreSQL)
• Также необходимо знать стандартные алгоритмы, структуры данных, шаблоны проектирования, и при этом иметь желание улучшать и оптимизировать существующий код.
• Web Basics (HTML, CSS, HTTP, JavaScript). В основном все проекты пишутся на ReactJs (SSR).
• Знание основ криптографии, желательно - опыт работы с Java Cryptography Extenstion;
• Большим плюсом будет опыт построения распределенных систем.
• Понимание принципов СI/CD;
• Linux (Debian/Ubuntu/CentOS);
• Docker, docker-compose, docker-cli;
🔺Задачи, которые предстоит решать:
• Разработка и сопровождение ПО в сфере приема и обработки платежей, веб-проектов;
• Модульное и интеграционное тестирование;
• Системная интеграция и развертывание приложений;
• Обеспечение технической поддержки второго и третьего уровня.
💻 Компания: Payneteasy
https://payneteasy.ru/
👨🏻💻👩🏻💻 Java разработчик (Middle/Regular)
🔺 Формат работы: Удаленная работа Full-time либо в нашем супер - офисе на Октябрьском поле
🔺 Занятость: полный рабочий день (гибкое начало дня, по 8 часов, 5/2)
💸 ЗП: от 180.000₽
📱 Контакты: HR Ксения: [email protected] или в личные сообщения ТГ @donnyjet (Отвечу на все вопросы!)
🔺Условия работы:
• Полная занятость;
• Высокопрофессиональный коллектив и много новых, инновационных и динамичных проектов
• Возможность профессионального и карьерного роста;
• Гибкий график работы
• Возможность работать из любой точки планеты или в комфортном офисе на Октябрьском поле
🔺Требования к кандидату:
• Опыт разработки на языке Java (от 3 лет);
• уверенное знание Java SE:
• Collections, I/O, Exceptions, GC, Generics
• Multithreading (synchronization, JMM, java.util.concurrent)
• Опыт работы Java EE:
• Servlet API
• JPA
• Знание и опыт использования Spring, NoSQL DB(Cassandra), SQL DB (MySQL, PostgreSQL)
• Также необходимо знать стандартные алгоритмы, структуры данных, шаблоны проектирования, и при этом иметь желание улучшать и оптимизировать существующий код.
• Web Basics (HTML, CSS, HTTP, JavaScript). В основном все проекты пишутся на ReactJs (SSR).
• Знание основ криптографии, желательно - опыт работы с Java Cryptography Extenstion;
• Большим плюсом будет опыт построения распределенных систем.
• Понимание принципов СI/CD;
• Linux (Debian/Ubuntu/CentOS);
• Docker, docker-compose, docker-cli;
🔺Задачи, которые предстоит решать:
• Разработка и сопровождение ПО в сфере приема и обработки платежей, веб-проектов;
• Модульное и интеграционное тестирование;
• Системная интеграция и развертывание приложений;
• Обеспечение технической поддержки второго и третьего уровня.
Какие существуют unchecked exception?
Наиболее часто встречающиеся:
Наиболее часто встречающиеся:
ArithmeticException
, ClassCastException
, ConcurrentModificationException
, IllegalArgumentException
, IllegalStateException
, IndexOutOfBoundsException
, NoSuchElementException
, NullPointerException
, UnsupportedOperationException
.О чем говорит ключевое слово throws?
Модификатор
Модификатор
throws
прописывается в заголовке метода и указывает на то, что метод потенциально может выбросить исключение с указанным типом.Что такое Heap и Stack память в Java? Какая разница между ними?
Heap (куча) используется Java Runtime для выделения памяти под объекты и классы. Создание нового объекта также происходит в куче. Это же является областью работы сборщика мусора. Любой объект, созданный в куче, имеет глобальный доступ и на него могут ссылаться из любой части приложения.
Stack (стек) это область хранения данных также находящееся в общей оперативной памяти (RAM). Всякий раз, когда вызывается метод, в памяти стека создается новый блок, который содержит примитивы и ссылки на другие объекты в методе. Как только метод заканчивает работу, блок также перестает использоваться, тем самым предоставляя доступ для следующего метода. Размер стековой памяти намного меньше объема памяти в куче. Стек в Java работает по схеме LIFO (Последний-зашел-Первый-вышел)
Различия между Heap и Stack памятью:
• Куча используется всеми частями приложения, в то время как стек используется только одним потоком исполнения программы.
• Всякий раз, когда создается объект, он всегда хранится в куче, а в памяти стека содержится лишь ссылка на него. Память стека содержит только локальные переменные примитивных типов и ссылки на объекты в куче.
• Объекты в куче доступны с любой точки программы, в то время как стековая память не может быть доступна для других потоков.
• Стековая память существует лишь какое-то время работы программы, а память в куче живет с самого начала до конца работы программы.
• Если память стека полностью занята, то Java Runtime бросает исключение
• Размер памяти стека намного меньше памяти в куче.
• Из-за простоты распределения памяти, стековая память работает намного быстрее кучи.
Для определения начального и максимального размера памяти в куче используются
Heap (куча) используется Java Runtime для выделения памяти под объекты и классы. Создание нового объекта также происходит в куче. Это же является областью работы сборщика мусора. Любой объект, созданный в куче, имеет глобальный доступ и на него могут ссылаться из любой части приложения.
Stack (стек) это область хранения данных также находящееся в общей оперативной памяти (RAM). Всякий раз, когда вызывается метод, в памяти стека создается новый блок, который содержит примитивы и ссылки на другие объекты в методе. Как только метод заканчивает работу, блок также перестает использоваться, тем самым предоставляя доступ для следующего метода. Размер стековой памяти намного меньше объема памяти в куче. Стек в Java работает по схеме LIFO (Последний-зашел-Первый-вышел)
Различия между Heap и Stack памятью:
• Куча используется всеми частями приложения, в то время как стек используется только одним потоком исполнения программы.
• Всякий раз, когда создается объект, он всегда хранится в куче, а в памяти стека содержится лишь ссылка на него. Память стека содержит только локальные переменные примитивных типов и ссылки на объекты в куче.
• Объекты в куче доступны с любой точки программы, в то время как стековая память не может быть доступна для других потоков.
• Стековая память существует лишь какое-то время работы программы, а память в куче живет с самого начала до конца работы программы.
• Если память стека полностью занята, то Java Runtime бросает исключение
java.lang.StackOverflowError
. Если заполнена память кучи, то бросается исключение java.lang.OutOfMemoryError: Java Heap Space
.• Размер памяти стека намного меньше памяти в куче.
• Из-за простоты распределения памяти, стековая память работает намного быстрее кучи.
Для определения начального и максимального размера памяти в куче используются
-Xms
и -Xmx
опции JVM. Для стека определить размер памяти можно с помощью опции -Xss
.Расскажите про приведение типов. Что такое понижение и повышение типа?
Java является строго типизированным языком программирования, а это означает, то что каждое выражение и каждая переменная имеет строго определенный тип уже на момент компиляции. Однако определен механизм приведения типов (casting) - способ преобразования значения переменной одного типа в значение другого типа.
В Java существуют несколько разновидностей приведения:
• Тождественное (identity). Преобразование выражения любого типа к точно такому же типу всегда допустимо и происходит автоматически.
• Расширение (повышение, upcasting) примитивного типа (widening primitive). Означает, что осуществляется переход от менее емкого типа к более ёмкому. Например, от типа byte (длина 1 байт) к типу int (длина 4 байта). Такие преобразование безопасны в том смысле, что новый тип всегда гарантировано вмещает в себя все данные, которые хранились в старом типе и таким образом не происходит потери данных. Этот тип приведения всегда допустим и происходит автоматически.
• Сужение (понижение, downcasting) примитивного типа (narrowing primitive). Означает, что переход осуществляется от более емкого типа к менее емкому. При таком преобразовании есть риск потерять данные. Например, если число типа int было больше 127, то при приведении его к byte значения битов старше восьмого будут потеряны. В Java такое преобразование должно совершаться явным образом, при этом все старшие биты, не умещающиеся в новом типе, просто отбрасываются - никакого округления или других действий для получения более корректного результата не производится.
• Расширение объектного типа (widening reference). Означает неявное восходящее приведение типов или переход от более конкретного типа к менее конкретному, т.е. переход от потомка к предку. Разрешено всегда и происходит автоматически.
• Сужение объектного типа (narrowing reference). Означает нисходящее приведение, то есть приведение от предка к потомку (подтипу). Возможно только если исходная переменная является подтипом приводимого типа. При несоответствии типов в момент выполнения выбрасывается исключение ClassCastException. Требует явного указания типа.
• Преобразование к строке (to String). Любой тип может быть приведен к строке, т.е. к экземпляру класса String.
• Запрещенные преобразования (forbidden). Не все приведения между произвольными типами допустимы. Например, к запрещенным преобразованиям относятся приведения от любого ссылочного типа к примитивному и наоборот (кроме преобразования к строке). Кроме того, невозможно привести друг к другу классы, находящиеся на разных ветвях дерева наследования и т.п.
При приведении ссылочных типов с самим объектом ничего не происходит - меняется лишь тип ссылки, через которую происходит обращение к объекту.
Для проверки возможности приведения нужно воспользоваться оператором
Java является строго типизированным языком программирования, а это означает, то что каждое выражение и каждая переменная имеет строго определенный тип уже на момент компиляции. Однако определен механизм приведения типов (casting) - способ преобразования значения переменной одного типа в значение другого типа.
В Java существуют несколько разновидностей приведения:
• Тождественное (identity). Преобразование выражения любого типа к точно такому же типу всегда допустимо и происходит автоматически.
• Расширение (повышение, upcasting) примитивного типа (widening primitive). Означает, что осуществляется переход от менее емкого типа к более ёмкому. Например, от типа byte (длина 1 байт) к типу int (длина 4 байта). Такие преобразование безопасны в том смысле, что новый тип всегда гарантировано вмещает в себя все данные, которые хранились в старом типе и таким образом не происходит потери данных. Этот тип приведения всегда допустим и происходит автоматически.
• Сужение (понижение, downcasting) примитивного типа (narrowing primitive). Означает, что переход осуществляется от более емкого типа к менее емкому. При таком преобразовании есть риск потерять данные. Например, если число типа int было больше 127, то при приведении его к byte значения битов старше восьмого будут потеряны. В Java такое преобразование должно совершаться явным образом, при этом все старшие биты, не умещающиеся в новом типе, просто отбрасываются - никакого округления или других действий для получения более корректного результата не производится.
• Расширение объектного типа (widening reference). Означает неявное восходящее приведение типов или переход от более конкретного типа к менее конкретному, т.е. переход от потомка к предку. Разрешено всегда и происходит автоматически.
• Сужение объектного типа (narrowing reference). Означает нисходящее приведение, то есть приведение от предка к потомку (подтипу). Возможно только если исходная переменная является подтипом приводимого типа. При несоответствии типов в момент выполнения выбрасывается исключение ClassCastException. Требует явного указания типа.
• Преобразование к строке (to String). Любой тип может быть приведен к строке, т.е. к экземпляру класса String.
• Запрещенные преобразования (forbidden). Не все приведения между произвольными типами допустимы. Например, к запрещенным преобразованиям относятся приведения от любого ссылочного типа к примитивному и наоборот (кроме преобразования к строке). Кроме того, невозможно привести друг к другу классы, находящиеся на разных ветвях дерева наследования и т.п.
При приведении ссылочных типов с самим объектом ничего не происходит - меняется лишь тип ссылки, через которую происходит обращение к объекту.
Для проверки возможности приведения нужно воспользоваться оператором
instanceof
:Parent parent = new Child();
if (parent instanceof Child) {
Child child = (Child) parent;
}
Spring Microservices in Action, Second Edition (2021)
Авторы: John Carnell, Illary Huaylupo Sánchez
Количество страниц: 448
Разделение больших приложений на отдельные автономные единицы делает микросервисы большим шагом на пути к уменьшению сложности и повышению гибкости. Spring Microservices in Action учит, как создавать приложения на основе микросервисов с использованием Java и платформы Spring. Это второе издание полностью обновлено для последней версии Spring, с расширенным охватом маршрутизации API с помощью Spring Cloud Gateway, логгирования с помощью стека ELK, метрик с помощью Prometheus и Grafana, безопасности с помощью Hashicorp Vault и современных практик развертывания с Kubernetes и Istio.
Скачать книгу
Авторы: John Carnell, Illary Huaylupo Sánchez
Количество страниц: 448
Разделение больших приложений на отдельные автономные единицы делает микросервисы большим шагом на пути к уменьшению сложности и повышению гибкости. Spring Microservices in Action учит, как создавать приложения на основе микросервисов с использованием Java и платформы Spring. Это второе издание полностью обновлено для последней версии Spring, с расширенным охватом маршрутизации API с помощью Spring Cloud Gateway, логгирования с помощью стека ELK, метрик с помощью Prometheus и Grafana, безопасности с помощью Hashicorp Vault и современных практик развертывания с Kubernetes и Istio.
Скачать книгу
Telegram
Книги для программистов (reserved)
Spring Microservices in Action, Second Edition (2021)
Авторы: John Carnell, Illary Huaylupo Sánchez
Авторы: John Carnell, Illary Huaylupo Sánchez
Что подразумевают в плане принципов ООП выражения «является» и «имеет»?
«является» подразумевает наследование.
«имеет» подразумевает ассоциацию (агрегацию или композицию).
«является» подразумевает наследование.
«имеет» подразумевает ассоциацию (агрегацию или композицию).
#вопросы_с_собеседований
В чём заключается разница между IO и NIO?
В чём заключается разница между IO и NIO?
Виртуальная стажировка – это онлайн-симулятор работы Java-разработчика в Сбере, в ходе которого ты станешь членом команды СберБизнеса и реализуешь проект по загрузке и обработке справочника городов России.
Виртуальная стажировка позволит тебе:
❗️ Получить опыт работы над проектом Сбера и включить его в свое резюме;
❗️ Попасть на реальную стажировку в Сбер в приоритетном порядке, пропустив первые этапы отбора;
❗️ Научиться выполнять реальные задачи стажера Java-разработчика Сбера и получить актуальные практические навыки.
Виртуальная стажировка:
🔓 Доступна для всех желающих: чтобы начать достаточно просто зарегистрироваться;
📆 Не привязана к временным срокам и не имеет внутренних дедлайнов: ты можешь начать в любое время и стажироваться в комфортном для тебя режиме.
👉 Узнать больше и пройти виртуальную стажировку
Виртуальная стажировка позволит тебе:
❗️ Получить опыт работы над проектом Сбера и включить его в свое резюме;
❗️ Попасть на реальную стажировку в Сбер в приоритетном порядке, пропустив первые этапы отбора;
❗️ Научиться выполнять реальные задачи стажера Java-разработчика Сбера и получить актуальные практические навыки.
Виртуальная стажировка:
🔓 Доступна для всех желающих: чтобы начать достаточно просто зарегистрироваться;
📆 Не привязана к временным срокам и не имеет внутренних дедлайнов: ты можешь начать в любое время и стажироваться в комфортном для тебя режиме.
👉 Узнать больше и пройти виртуальную стажировку
☕️ Java IO (input-output) является потокоориентированным, а Java NIO (new/non-blocking io) – буфер-ориентированным. Потокоориентированный ввод/вывод подразумевает чтение/запись из потока/в поток одного или нескольких байт в единицу времени поочередно. Данная информация нигде не кэшируются. Таким образом, невозможно произвольно двигаться по потоку данных вперед или назад. В Java NIO данные сначала считываются в буфер, что дает больше гибкости при обработке данных.
☕️ Потоки ввода/вывода в Java IO являются блокирующими. Это значит, что когда в потоке выполнения вызывается read() или write() метод любого класса из пакета java.io.*, происходит блокировка до тех пор, пока данные не будут считаны или записаны. Поток выполнения в данный момент не может делать ничего другого. Неблокирующий режим Java NIO позволяет запрашивать считанные данные из канала (channel) и получать только то, что доступно на данный момент, или вообще ничего, если доступных данных пока нет. Вместо того, чтобы оставаться заблокированным пока данные не станут доступными для считывания, поток выполнения может заняться чем-то другим. Тоже самое справедливо и для неблокирующего вывода. Поток выполнения может запросить запись в канал некоторых данных, но не дожидаться при этом пока они не будут полностью записаны.
☕️ В Java NIO имеются селекторы, которые позволяют одному потоку выполнения мониторить несколько каналов ввода. Т.е. существует возможность зарегистрировать несколько каналов с селектором, а потом использовать один поток выполнения для обслуживания каналов, имеющих доступные для обработки данные, или для выбора каналов, готовых для записи.
☕️ Потоки ввода/вывода в Java IO являются блокирующими. Это значит, что когда в потоке выполнения вызывается read() или write() метод любого класса из пакета java.io.*, происходит блокировка до тех пор, пока данные не будут считаны или записаны. Поток выполнения в данный момент не может делать ничего другого. Неблокирующий режим Java NIO позволяет запрашивать считанные данные из канала (channel) и получать только то, что доступно на данный момент, или вообще ничего, если доступных данных пока нет. Вместо того, чтобы оставаться заблокированным пока данные не станут доступными для считывания, поток выполнения может заняться чем-то другим. Тоже самое справедливо и для неблокирующего вывода. Поток выполнения может запросить запись в канал некоторых данных, но не дожидаться при этом пока они не будут полностью записаны.
☕️ В Java NIO имеются селекторы, которые позволяют одному потоку выполнения мониторить несколько каналов ввода. Т.е. существует возможность зарегистрировать несколько каналов с селектором, а потом использовать один поток выполнения для обслуживания каналов, имеющих доступные для обработки данные, или для выбора каналов, готовых для записи.
#вопросы_с_собеседований
В каком случае требуется переопределять метод service()?
В каком случае требуется переопределять метод service()?
Метод service() переопределяется, когда необходимо, чтобы сервлет обрабатывал все запросы (и GET, и POST) в одном методе.
Когда контейнер сервлетов получает запрос клиента, то происходит вызов метода service(), который в зависимости от поступившего запроса вызывает или метод doGet() или метод doPost().
Когда контейнер сервлетов получает запрос клиента, то происходит вызов метода service(), который в зависимости от поступившего запроса вызывает или метод doGet() или метод doPost().
This media is not supported in your browser
VIEW IN TELEGRAM
Продолжаем следить за конкурсами с денежными призами. «Цифровой прорыв» совместно с Mail.Ru Group запускают IT-чемпионат по ML, AI и Data Science. Есть три задачи:
- Модель прогноза средних цен и объемов потребления товаров (ФНС России и Росстат)
- ИИ для поиска самолетов на снимках местности при проведении поисково-спасательных операций (Росавиация)
- ИИ для распознавания категории предмета музейного фонда (Минкультуры России)
Как видите, задачи практичные и важные, на решение дается целый месяц — с 14 июля по 14 августа. В каждой из трех задач есть 25 призовых мест, за первое место дают 100 тыс. ₽. Регистрация и подробности здесь: https://proglib.io/w/24a90147
- Модель прогноза средних цен и объемов потребления товаров (ФНС России и Росстат)
- ИИ для поиска самолетов на снимках местности при проведении поисково-спасательных операций (Росавиация)
- ИИ для распознавания категории предмета музейного фонда (Минкультуры России)
Как видите, задачи практичные и важные, на решение дается целый месяц — с 14 июля по 14 августа. В каждой из трех задач есть 25 призовых мест, за первое место дают 100 тыс. ₽. Регистрация и подробности здесь: https://proglib.io/w/24a90147
🛠 Почему Java используется для разработки мобильных приложений?
Если вы подумываете заняться разработкой мобильных приложений, возникает вопрос выбора языка программирования. Одним из лучших вариантов считается Java – рассказываем почему.
https://proglib.io/sh/y7Jmec9Gnj
Если вы подумываете заняться разработкой мобильных приложений, возникает вопрос выбора языка программирования. Одним из лучших вариантов считается Java – рассказываем почему.
https://proglib.io/sh/y7Jmec9Gnj
Что делает volatile?
Во-первых, чтение/запись такого поля становятся атомарными. Это применение актуально только для
Второй и самый интересный эффект – пара событий запись-чтение для такого поля являются synchronization actions. Значит, между ними существует отношение happens-before. Это значит, что существует гарантия, что произошедшее в памяти до записи будет видно после чтения. То есть будут успешно прочитаны значения, записанные в другие переменные.
Для полного понимания темы рекомендуется к просмотру доклад Алексея Шипилёва и документация. Лучше всего эффект
Этот эффект используется для получения простой и дешевой адаптации программы к многопоточной среде без использования сложных и ошибкоопасных техник блокировок и синхронизаций.
volatile
– ключевое слово для работы с многопоточностью. Не то же самое, что volatile
в C++, не обязано делать что-либо с кэшем процессора. Оказывает на поле объекта ровно два эффекта.Во-первых, чтение/запись такого поля становятся атомарными. Это применение актуально только для
long
и double
, и не на всех платформах. Для остальных типов полей это верно и так.Второй и самый интересный эффект – пара событий запись-чтение для такого поля являются synchronization actions. Значит, между ними существует отношение happens-before. Это значит, что существует гарантия, что произошедшее в памяти до записи будет видно после чтения. То есть будут успешно прочитаны значения, записанные в другие переменные.
Для полного понимания темы рекомендуется к просмотру доклад Алексея Шипилёва и документация. Лучше всего эффект
volatile
иллюстрирует задача из этого доклада, которую часто и дают в качестве этого вопроса. Вопрос – что выведет данный код:int a; int b;Трюк в том, что помимо очевидных 21 (поток 2 отработал после 1), 00 (поток 2 отработал до 1, переменные еще не инициализированы) и 01 (поток 2 сработал между записями), может быть и неожиданные 20. Дело в том, что для операторов одного потока действует program order, он гарантирует хотя бы видимость правильной последовательности операций. Между потоками необходим «мост» из happens-before. Его даст применение модификатора
// thread 1:
a = 1;
b = 2;
// thread 2:
System.out.print(b);
System.out.print(a);
volatile
к переменной b
, неожиданный результат 20 будет исключен.Этот эффект используется для получения простой и дешевой адаптации программы к многопоточной среде без использования сложных и ошибкоопасных техник блокировок и синхронизаций.
YouTube
Алексей Шипилёв — Прагматика Java Memory Model
Ближайшая конференция — JPoint 2025, 3–4 апреля (Москва + трансляция).
Подробности и билеты: https://jrg.su/T2zfbS
— —
. . . . Встреча JUG.ru c Алексеем Шипилёвым из Oracle — Прагматика Java Memory Model.
6 февраля 2014 года.
Это самая первая (необкатанная)…
Подробности и билеты: https://jrg.su/T2zfbS
— —
. . . . Встреча JUG.ru c Алексеем Шипилёвым из Oracle — Прагматика Java Memory Model.
6 февраля 2014 года.
Это самая первая (необкатанная)…
Какими значениями инициализируются переменные по умолчанию?
• Числа инициализируются 0 или 0.0;
• char — \u0000;
• boolean — false;
• Объекты (в том числе String) — null.
• Числа инициализируются 0 или 0.0;
• char — \u0000;
• boolean — false;
• Объекты (в том числе String) — null.
⚖️ Что такое лицензирование ПО и как оно работает?
Рассказываем о классификации лицензий и даем практические советы по лицензированию программного обеспечения.
https://proglib.io/sh/6KQ4TnvaNb
Рассказываем о классификации лицензий и даем практические советы по лицензированию программного обеспечения.
https://proglib.io/sh/6KQ4TnvaNb
#вопросы_с_собеседований
Что такое JSTL (JSP Standard tag library)?
Что такое JSTL (JSP Standard tag library)?