Telegram Web Link
Эволюция сборщика мусора от JDK 8 до JDK 18

Со времен все еще популярной JDK 8 прошло ровно 10 релизов. Эта годовщина — хорошая возможность сделать паузу и посмотреть, что произошло со сборщиками мусора HotSpot JVM за это время: как он изменился, что было улучшено и добавлено.

https://blogs.oracle.com/javamagazine/post/java-garbage-collectors-evolution
🔌 Что будет, если очередь пула потоков уже заполнена, но подаётся новая задача?

Если очередь пула потоков заполнилась, то поданная задача будет «отклонена». Например - метод submit() у ThreadPoolExecutor выкидывает RejectedExecutionException, после которого вызывается RejectedExecutionHandler.

В чём заключается различие между методами submit() и execute() у пула потоков?
Оба метода являются способами подачи задачи в пул потоков, но между ними есть небольшая разница.

execute(Runnable command) определён в интерфейсе Executor и выполняет поданную задачу и ничего не возвращает.

submit() – перегруженный метод, определённый в интерфейсе ExecutorService. Способен принимать задачи типов Runnable и Callable и возвращать объект Future, который можно использовать для контроля и управления процессом выполнения, получения его результата.

В чем заключаются различия между cтеком (stack) и кучей (heap) с точки зрения многопоточности?
Cтек – участок памяти, тесно связанный с потоками. У каждого потока есть свой стек, которые хранит локальные переменные, параметры методов и стек вызовов. Переменная, хранящаяся в стеке одного потока, не видна для другого.

Куча – общий участок памяти, который делится между всеми потоками. Объекты, неважно локальные или любого другого уровня, создаются в куче. Для улучшения производительности, поток обычно кэширует значения из кучи в свой стек, в этом случае для того, чтобы указать потоку, что переменную следует читать из кучи используется ключевое слово volatile.

Чем полезны неизменяемые объекты?
Неизменяемость (immutability) помогает облегчить написание многопоточного кода. Неизменяемый объект может быть использован без какой-либо синхронизации. К сожалению в Java нет аннотации @Immutable, которая делает объект неизменяемым, для этого разработчикам нужно самим создавать класс с необходимыми характеристиками. Для этого необходимо следовать некоторым общим принципам: инициализация всех полей только конструкторе, отсутствие методов setX() вносящих изменения в поля класса, отсутствие утечек ссылки, организация отдельного хранилища копий изменяемых объектов и т.д.

Даны 3 потока т1, т2 и т3? Как реализовать выполнение в последовательности т1, т2, т3?
Такой последовательности выполнения можно достичь многими способами, например просто воспользоваться методом join(), чтобы запустить поток в момент, когда другой уже закончит своё выполнение. Для реализации заданной последовательности, нужно запустить последний поток первым, и затем вызывать метод join() в обратном порядке, то есть Т3 вызывает Т2.join, а Т2 вызывает Т1.join, таким образом Т1 закончит выполнение первым, а Т3 последним.

Что такое «шаблон проектирования»?
Шаблон (паттерн) проектирования (design pattern) — это проверенное и готовое к использованию решение. Это не класс и не библиотека, которую можно подключить к проекту, это нечто большее - он не зависит от языка программирования, не является законченным образцом, который может быть прямо преобразован в код и может быть реализован по разному в разных языках программирования.

Плюсы использования шаблонов:

снижение сложности разработки за счёт готовых абстракций для решения целого класса проблем.

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

унификация деталей решений: модулей и элементов проекта.

возможность отыскав удачное решение, пользоваться им снова и снова.

помощь в выборе выбрать наиболее подходящего варианта проектирования.

Минусы:

+
слепое следование некоторому выбранному шаблону может привести к усложнению программы.

желание попробовать некоторый шаблон в деле без особых на то оснований.

Еще про пул потоков

@javatg
#вопросы_с_собеседований
Что такое контроллер в среде Spring MVC?

Контроллеры предоставляют доступ к поведению приложения. Эти поведения обычно определяются через интерфейс-сервис. Контроллеры интерпретируют пользовательский ввод и преобразовывают его в модель, которая представляется пользователю. В Spring контроллер реализован очень абстрактно. Это позволяет создавать широкий спектр контроллеров.
Что значит «приоритет потока»?

Для того, чтобы как-то помочь диспетчеру, какие потоки являются наиболее важными, существуют приоритеты потоков. В java.thread описаны 3 идентификатора, которые определяют приоритеты для потоков:

MIN_PRIORITY;

MAX_PRIORITY;

NORM_PRIORITY;

Все потоки создаются с приоритетом NORM_PRIORITY. И соответственно, на программиста ложится задача распределения приоритетов потоков, т.е. он должен понять, какой поток важный, а какой - нет, и поменять с помощью метода setPriority() приоритет потока.

Что такое «потоки-демоны»?

Потоки-демоны отличаются от обычных потоков тем, что при завершении всех потоков, кроме потоков-демонов, программа завершается. Для обеспечения "демоничности" потоков служат два метода класса Thread :

public final boolean isDaemon() - позволяет проверить, является ли поток демоном.

public final void setDaemon(boolean on) - устанавливает/снимает признак потока-демона.

Можно ли сделать основной поток программы демоном?

Нет. Потоки-демоны позволяют описывать фоновые процессы, которые нужны только для обслуживания основных потоков выполнения и не могут существовать без них.

Что значит «усыпить» поток?

Это значит приостановить его на определенный промежуток времени, вызвав в ходе его выполнения статический метод Thread.sleep() передав в качестве параметра необходимое количество времени в миллисекундах. До истечения этого времени поток может быть выведен из состояния ожидания вызовом interrupt() с выбрасыванием InterruptedException.

Как остановить поток?

На данный момент в Java принят уведомительный порядок остановки потока (хотя JDK 1.0 и имеет несколько управляющих выполнением потока методов, например stop(), suspend() и resume() - в следующих версиях JDK все они были помечены как deprecated из-за потенциальных угроз взаимной блокировки).

Для корректной остановки потока можно использовать метод класса Thread - interrupt(). Этот метод выставляет некоторый внутренний флаг-статус прерывания. В дальнейшем состояние этого флага можно проверить с помощью метода isInterrupted() или Thread.interrupted() (для текущего потока). Метод interrupt() также способен вывести поток из состояния ожидания или спячки. Т.е. если у потока были вызваны методы sleep() или wait() – текущее состояние прервется и будет выброшено исключение InterruptedException. Флаг в этом случае не выставляется.

Схема действия при этом получается следующей:

Реализовать поток.

В потоке периодически проводить проверку статуса прерывания через вызов isInterrupted().

Если состояние флага изменилось или было выброшено исключение во время ожидания/спячки, следовательно поток пытаются остановить извне.

Принять решение – продолжить работу (если по каким-то причинам остановиться невозможно) или освободить заблокированные потоком ресурсы и закончить выполнение.

Возможная проблема, которая присутствует в этом подходе – блокировки на потоковом вводе-выводе. Если поток заблокирован на чтении данных - вызов interrupt() из этого состояния его не выведет. Решения тут различаются в зависимости от типа источника данных. Если чтение идет из файла – долговременная блокировка крайне маловероятна и тогда можно просто дождаться выхода из метода read(). Если же чтение каким-то образом связано с сетью – стоит использовать неблокирующий ввод-вывод из Java NIO.
Что такое неизменяемый класс?

Класс называется неизменяемым, если его состояние не может быть изменено после создания. К примеру String в Java является неизменяемым. Как только вы создадите строку, вы не можете изменить ее содержание, и любая операция над ней вернёт новый объект.

Неизменяемые объекты хорошо применять при многопоточном программировании, так как при их использовании вы можете не беспокоиться о синхронизации. По сути, вся парадигма функционального программирования построена на неизменяемых объектах.

Подробнее тут: https://javarevisited.blogspot.com/2013/03/how-to-create-immutable-class-object-java-example-tutorial.html#axzz7O0LoB9rM

@javatg
Что такое «fail-fast поведение»?

fail-fast поведение означает, что при возникновении ошибки или состояния, которое может привести к ошибке, система немедленно прекращает дальнейшую работу и уведомляет об этом. Использование fail-fast подхода позволяет избежать недетерминированного поведения программы в течение времени.

В Java Collections API некоторые итераторы ведут себя как fail-fast и выбрасывают ConcurrentModificationException, если после его создания была произведена модификация коллекции, т.е. добавлен или удален элемент напрямую из коллекции, а не используя методы итератора.

Реализация такого поведения осуществляется за счет подсчета количества модификаций коллекции (modification count):

• при изменении коллекции счетчик модификаций так же изменяется;
• при создании итератора ему передается текущее значение счетчика;
• при каждом обращении к итератору сохраненное значение счетчика сравнивается с текущим, и, если они не совпадают, возникает исключение.

@javatg
Уроки абстракции: чему FP может научить ООП

Одним из наиболее распространенных «лучших практик» в программировании является принцип DRY: не повторяйся. Для реализации этого принципа можно использовать множество методов: инкапсуляция, параметризация, инверсия управления и многое другое. Одним из этих методов является абстракция, и одно из основных различий между функциональным программированием (FP) и объектно-ориентированным программированием (ООП) заключается в способе применения абстракции. Обычной практикой в ООП является ограничение абстракции до строгого полезного минимума для рассматриваемой проблемы. В ООП преждевременное абстрагирование часто считается ошибкой, как и преждевременная оптимизация.

В FP, с другой стороны, абстракция, как правило, продвигается настолько далеко, насколько это возможно. Каждая проблема разбита на серию простейших возможных функций, которые затем комбинируются для построения решения проблемы. Выявление этих абстракций обычно является наиболее важной частью решения проблемы. Фактически, программисты FP часто тратят больше времени на то, чтобы найти, какую проблему им следует решить, чем на их решение. И, конечно же, обычно кажется, что эти функции одинаковы от одной проблемы к другой. Только способ их комбинирования отличается. Это причина, по которой абстракция является одним из наиболее ценных методов, используемых программистами FP.

Читать дальше

@javatg
📊 Паттерн Посетитель в Java уже не актуален – лучше использовать переключатели паттернов

В современном языке Java паттерн Посетитель (Visitor) уже не нужен. Он отлично компенсируется использованием запечатанных типов и переключателей, использующих сопоставление с шаблоном – в таком случае те же цели достигаются проще и меньшим объемом кода.

Всякий раз, оказываясь в ситуации, где мог бы применяться паттерн Посетитель, подумайте, не воспользоваться ли вместо него более современными возможностями языка Java. Разумеется, эти возможности могут использоваться и в других обстоятельствах, но в этой статье мы обсудим сравнительно узкую тему: чем заменить паттерн Посетитель. Для этого я начну с максимально краткого введения и приведу пример, а затем объясню, как достичь тех же целей более простым (и кратким) кодом.

 Читать дальше

@javatg
Anonymous Messenger – Одноранговый мессенджер на java, работающий через tor.

Функционал:
• Голосовые сообщения
• Живые голосовые вызовы через tor (альфа-функция)
• Текстовые сообщения
• Медиа-сообщения с удаленными метаданными
• Отправка необработанных файлов любого размера (100 ГБ +)
• Исчезающие сообщения по умолчанию
• Зашифрованное хранилище файлов на Android
• Шифрование по протоколу Диффи-Хеллмана

#GitHub | #Java #Messenger

@javatg
↘️ Java и MySQL база данных / Разработка приложения на JavaFx

Язык Java обладает большим набором функций, за счет которых вы можете построить как приложение под мобильное устройство, так и программу для ПК. Давайте создадим программу «Список дел» на JavaFx.

Инструменты что нам понадобятся
Наш проект будет не столь гигантским, но все же увесистым в плане количества функций и набора библиотек. Для разработки проекта нам понадобится:

установленная на компьютере Java;
среда разработки, например, IntelliJ IDEA;
библиотека JavaFx;
коннектор MySQL для работы с базой данных.


Читать дальше

@javatg
Как сделать код с арифметикой кроссплатформенным?

Степень платформонезависимости Java явно определяется её спецификацией. Согласно спецификации, когда мы работаем с числами с плавающей точкой, на продакшне результат арифметических вычислений может отличаться от локального. Это не всегда проблема, но об этом стоит помнить.

Во-первых, разберемся насколько сильно результатам позволено расходиться. В документации разных методов из Math эта величина выражается в единицах ulp (unit in the last place). Это то, насколько увеличится число, если его битовое выражение увеличить на 1 бит. Для разных чисел значение ulp будет различаться. Получить его можно методом Math.ulp(x).

Если объявленной точности не хватает, на помощь придет класс StrictMath. В нём находится примерно такой же набор инструментов как в Math, но с повторяемыми результатами, которые можно получить стандартизованными алгоритмами на C.

Для обычных языковых выражений вроде инициализаторов и операторов введено понятие свойства FP-strict. Выражения с этим свойством будут кроссплатформенным. Чтобы добавить свойство всем операторам, на методе используется модификатор strictfp (о котором мы уже упоминали).

#Язык
Под каким типом хранить период времени?

В стандартной библиотеке современных версий Java для этих целей есть два класса:

Period – календарный период. Количество дней, месяцев и лет. Одним днем здесь считается день в терминах ZonedDateTime.

Duration – длительность времени. Количество наносекунд, секунд, минут, часов, и тоже дней. Здесь один день – ровно 24 часа.

Оба класса реализуют общий интерфейс TemporalAmount – период времени вообще. Оба иммутабельны, и как следствие, потокобезопасны. Любая модифицирующая операция вроде plusX() возвращает новый экземпляр с измененным значением.

Экземпляры обоих классов могут быть созданы из значений отдельных компонентов, из двух моментов времени методом between, или из строки. Строковое представление Duration: "P2DT3H4M", Period: "P1Y2M3D".

До Java 8 основным способом хранения периода были числовые примитивы. В этом подходе есть много недостатков, среди которых в первую очередь неограниченность значений и ненаглядность. Чтобы в Java 8+ получить период числом, используется метод between() нужного элемента енама ChronoUnit.

#Классы

@javatg
#вопросы_с_собеседований
Какие типы Java могут имплементировать интерфейсы?

В Java нет концепции множественного наследования, но с помощью интерфейса мы можем его добиться. По сути, интерфейс - это именованный набор определений без реализации. Интерфейс в Java - это особый вид класса. Подобно классам, интерфейс содержит методы и члены; в отличие от классов, в интерфейсе все члены являются окончательными, а все методы абстрактными.

В основном существуют 5 типов Java, которые могут реализовывать интерфейсы:

1. Обычный класс
2. Абстрактный класс
3. Вложенный класс
4. Enum
5. Динамический прокси
How many compiler errors in the code?
Anonymous Quiz
10%
0
15%
1
26%
2
25%
3
12%
4
12%
5
CodeAnalysisСтатический анализатор кода

Анализ кода заключается в проверке программного кода с помощью лексического анализа, грамматического анализа, control flow, анализа потока данных и других технологий, чтобы проверить, соответствует ли код стандартизации, безопасности, надежности, ремонтопригодности, частичной производительности и т. д., а также провести комплексный анализ кода.

Поддержка языков: Java/C++/ObjectiveC/C#/JavaScript/Python/Go/PHP и многие другие

@javatg
Учебник по Java: cтатический и динамический полиморфизм

В статье разберемся с одной из ключевых концепций объектно-ориентированного программирования — полиморфизмом — и посмотрим, как она реализована в Java.

Читать

@javatg
#вопросы_с_собеседований
Что такое Java-конфигурация? Как она применяется?

Чтобы создать класс с конфигурацией на основе Java-кода, нужно аннотировать его с помощью
@Configuration.
Этот класс будет содержать фабричные методы для создания бинов в контейнере.
Эти методы должны быть аннотированы аннотацией @Bean.

Этот класс поместит в контейнер экземпляр класса DataSource. Позднее его можно будет использовать при доступе к базе данных.
2024/10/04 07:35:02
Back to Top
HTML Embed Code: