Telegram Web Link
Что выведет код сверху?
Anonymous Quiz
43%
40
3%
0
54%
Compiler Error
Что находится внутри класса Math? (1/2)

java.lang.Math – типичный utility-класс с только статическими членами и закрытым конструктором. Он предоставляет набор математических функций. Условно члены класса можно разделить на следующие категории:

Основные математические функции. Общепринятые математические действия, для которых не нашлось операторов в синтаксисе языка Java.

Тригонометрия. Важные функции из соответствующего раздела математики.

Защита от переполнения. Если Integer.MAX_VALUE увеличить на 1, получится Integer.MIN_VALUE. При переполнении максимально возможного значения, оно «идет по кругу». История помнит, как дорого может стоить эта ошибка. Набор специальных функций помогает работать с переполнениями безопаснее.

Комбинации математических операций. Часто используемые сочетания функций, которые вместе могут быть вычислены компьютером эффективнее, чем если вызывать по отдельности. Как пример, среднее квадратическое: sqrt(x^2 + y^2).

IEEE754. Из-за особенностей хранения в компьютере чисел с плавающей точкой, расстояние между двумя соседними числами бывает разным. Это расстояние называется ulp (units in the last place). Набор методов дает возможность работать с этим значением. В терминах ulp также определяется точность всех методов Math по работе с дробными числами.

Округление. Поиск ближайших к заданному целых чисел.

Конвертация углов. Из градусов в радианы и обратно.

Константы. Число Пи и число Эйлера.

#Классы

@javatg
Какой модификатор объявляет что метод может быть использован только в своем классе?
Anonymous Quiz
1%
public
4%
local
88%
private
4%
static
2%
final
Apache Kafka для магазинов

Всем привет! Меня зовут Игорь, я работаю системным архитектором в CSI. Хочу поделиться историей появления в нашем стеке технологий надежного и универсального брокера сообщений. Расскажу, как и для чего мы его используем, поделюсь полезными нюансами и примером с сетью Fix Price. Статей про Apache Kafka уже более, чем достаточно, но наш кейс немного отличается от стандартного использования. Надеюсь, опыт пригодится кому-то ещё.

Читать статью
💡 alibaba/fastjson

Библиотека для быстрого преобразования любых Java-объектов в JSON-представление и обратно. Поддерживаются и объекты со сложной структурой, глубокими иерархиями наследования. В целом улучшает производительность программ.

https://github.com/alibaba/fastjson

@javatg
Чем отличается CountDownLatch от CyclicBarrier?

CountDownLatch, дословно «Запор с обратным отсчетом», – примитив синхронизации из стандартной библиотеки Java. Он останавливает пришедшие потоки, пока внутренний счетчик не достигнет нуля. Чтобы поставить поток на ожидание, нужно вызвать из него метод await().

Начальное значение счетчика задается параметром конструктора, затем уменьшается на 1 методом countDown(). Узнать текущее значение можно с помощью getCount(). Изменение значения счетчика никак не связано с потоками, его можно вызывать откуда и когда угодно.

CyclicBarrier – барьер для потоков, который ломается при достижении критической массы ожидающих. Это тоже класс из Java Concurrency Framework. Поток также встает на ожидание методом await(). Ожидающие потоки называются parties, их лимит также устанавливается в конструкторе.

Технически, parties барьера и count латча – одно и то же, await барьера – это await+countDown латча. В барьере тоже доступна информация о текущем состоянии барьера (методы isBroken, getParties и getNumberWaiting).

Помимо этого, CyclicBarrier дает две дополнительных возможности. Во-первых, в конструктор кроме parties можно передать коллбэк с действием, которое выполнится в момент прорыва барьера. Во-вторых, этот примитив переиспользуется: метод reset() насильно прорывает текущий барьер и устанавливает новый.

Оба этих примитива помогают решить задачу о гарантированных дедлоках. Противоположность латча и барьера – семафор. В нём потоки блокируются при достижении счетчиком нуля.

#Многопоточность

@javatg
💡Спасти мир с помощью кода

Машины едут вверх колесами, а птицы ходят по земле. Создатель мира написал код, на котором построена наша реальность, но допустил серьезные ошибки. Если их не починить, масштабы бедствия будут серьезнее. На разработчиков легла большая ответственность – реши задачи на Java и стань тем, кто сможет все исправить. При этом вариантов спасения мира много – найдите их все.

Спасти мир

@javatg
Можно ли сузить уровень доступа/тип возвращаемого значения при переопределении метода?

• При переопределении метода нельзя сузить модификатор доступа к методу (например с public в MainClass до private в Class extends MainClass).
• Изменить тип возвращаемого значения при переопределении метода нельзя, будет ошибка attempting to use incompatible return type.
• Можно сузить возвращаемое значение, если они совместимы.
Например:

public class Animal {

public Animal eat() {
System.out.println("animal eat");
return null;
}

public Long calc() {
return null;
}

}
public class Dog extends Animal {

public Dog eat() {
return new Dog();
}
/*attempting to use incompatible return type
public Integer calc() {
return null;
}
*/
}

@javatg
Micronaut. Краткое руководство о том, как создавать микросервисы с помощью этого JVM-фреймворка

Работа многих JVM-фреймворков с инверсией управления (IoC frameworks) базируется на применении рефлексии (reflection-based). Это означает, что, для функционирования, таким фреймворкам требуется загружать и кэшировать данные рефлексии для каждого бина (bean) внутри контекста приложения.

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

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

@javatg
Как с минимальными усилиями сделать классы Java более согласованными
Сотни человеко-часов уходят на исправление настолько нелепых ошибок, которых вообще не должно было быть. Иногда это пресловутые NullPointerExceptions, иногда они связаны с консистентностью — согласованностью данных друг с другом. Рассматриваем вам простое решение, которое поможет избежать подобных ошибок без пересмотра написания каждого объекта.

Читаем
Современные требования к Java-разработчику: о чём вас спросят на собеседовании

В этой статье Java Team Lead EPAM Олег Клименко рассказал, что, помимо Java Core, требуется от разработчиков на разных этапах карьеры. Олег прошёл большой путь к текущей позиции: получил классическое образование по направлению «Прикладная математика и информатика», дорос до архитектора решений, какое-то время занимал менеджерскую позицию, но решил вернуться к кодингу и пришёл на позицию Lead Software Engineer в EPAM. Статья поможет разобраться, о чём сегодня могут спрашивать Java-разработчиков на интервью.

Читать статью
Почему не рекомендуется использовать метод Thread.Stop()?

При принудительной остановке (приостановке) потока, stop() прерывает поток в недетерменированном месте выполнения, в результате становится совершенно непонятно, что делать с принадлежащими ему ресурсами. Поток может открыть сетевое соединение - что в таком случае делать с данными, которые еще не вычитаны? Где гарантия, что после дальнейшего запуска потока (в случае приостановки) он сможет их дочитать? Если поток блокировал разделяемый ресурс, то как снять эту блокировку и не переведёт ли принудительное снятие к нарушению консистентности системы? То же самое можно расширить и на случай соединения с базой данных: если поток остановят посередине транзакции, то кто ее будет закрывать? Кто и как будет разблокировать ресурсы?

Что происходит, когда в потоке выбрасывается исключение?
Если исключение не поймано – поток «умирает» (переходит в состяние мёртв (dead)).

Если установлен обработчик непойманных исключений, то он возьмёт управление на себя. Thread.UncaughtExceptionHandler – интерфейс, определённый как вложенный интерфейс для других обработчиков, вызываемых, когда поток внезапно останавливается из-за непойманного исключения. В случае, если поток собирается остановиться из-за непойманного исключения, JVM проверяет его на наличие UncaughtExceptionHandler, используя Thread.getUncaughtExceptionHandler(), и если такой обработчик найдет, то вызовет у него метод uncaughtException(), передав этот поток и исключение в виде аргументов.

Что такое «пул потоков»?

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

Начиная с Java 1.5 Java API предоставляет фреймворк Executor, который позволяет создавать различные типы пула потоков:

Executor - упрощенный интерфейс пула, содержит один метод для передачи задачи на выполнение;

ExecutorService - расширенный интерфейс пула, с возможностью завершения всех потоков;

AbstractExecutorService - базовый класс пула, реализующий интерфейс ExecutorService;

Executors - фабрика объектов связанных с пулом потоков, в том числе позволяет создать основные типы пулов;

ThreadPoolExecutor - пул потоков с гибкой настройкой, может служить базовым классом для нестандартных пулов;

ForkJoinPool - пул для выполнения задач типа ForkJoinTask;

... и другие.

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

@javatg
2024/10/04 09:27:17
Back to Top
HTML Embed Code: