Telegram Web Link
Модификаторы synchronized, volatile, transient, native

Модификаторы synchronized, volatile, transient, native: что обозначают и как они используются.

synchronized
Этим модификатором может быть помечена функция или блок кода.
Если помечена нестатическая функция, то такие функции для этого объекта невозможно выполнять параллельно из нескольких потоков (остальные потоки ждут, пока блок будет выполнен потоком, захватившим монитор).
Для статической функции класса то же самое, что и для объекта, только монитором будет не объект, а сам класс.
При возникновении в методе необрабатываемого исключения - монитор освобождается и блокировка с кода снимается.
Если модификатором synchronized помечается блок кода, то в скобках указывается какой объект будет монитором. Блоки с одинаковыми мониторами выполняются последовательно.

volatile
Модификатор переменной указывает на то, что при обращении к переменной на чтение требуется получить текущее значение переменной (невозможно использование кэшей и т.д.)

transient
Модификатор переменной говорит о том, что переменная не подлежит сериализации. При десериализации требуется выставить значение по умолчанию (в readObject'е).

native
Модификатор метода указывает на то, что реализация метода написана на другой программной платформе.


@javatg
Collections.min/max

Удивительно, насколько часто можно встретить написанный вручную код, который находит максимальный или минимальный элемент чего-то по какому-нибудь критерию.

Казалось бы, такая тривиальная задача должна быть давно решена. На самом деле она и так давно решена: есть методы Collections.min и Collections.max. Раньше было не очень удобно писать компараторы, но в Java-8 всё стало легче.

К примеру, вам нужно найти ключ в Map, соответствующий максимальному значению.

@javatg
Работа с БД с помощью JDBC

1. Утверждения (Statements)
Взаимодействовать с БД мы можем с помощью трёх интерфейсов, которые реализуются каждым драйвером:

Statement - этот интерфейс используется для доступа к БД для общих целей. Он крайне полезен, когда мы используем статические SQL – выражения во время работы программы. Этот интерфейс не принимает никаких параметров.
PreparedStatement - этот интерфейс может принимать параметры во время работы программы.
CallableStatement - этот интерфейс становится полезным в случае, когда мы хотим получить доступ к различным процедурам БД. Он также может принимать параметры во время работы программы.

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

@javatg
В чём отличия интерфейса от абстрактного класса?

Главное отличие – это семантика. Интерфейсы появились еще до Java, как важная концепция ООП. Смысл интерфейса – некое поведение, описание свойства. Причем если придерживаться принципа сегрегации интерфейсов, это описание единственного аспекта поведения.

Класс, даже абстрактный – это комбинация всех свойств и их реализаций, которыми определяются сущности некоторой категории (собственно, класса).

Отсюда вытекает естественность и необходимость множественного наследования для интерфейсов. Опыт таких языков как C++ показал, что множественное наследование классов не нужно и проблемно (см. проблема ромбовидного наследования). По факту же обычно нужно всего лишь переиспользование кода, что не относится к ООП и реализуется в некоторых языках «интерфейсами с независимым состоянием» – примесями.

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

В интерфейсах, как публичных описаниях, не имеют смысла и запрещены непубличные члены. Отсюда синтаксическое отличие: модификатор public, как и abstract для методов или static для полей, можно не писать. Запрещены и модификаторы, несовместимые с abstract: final, synchronized и прочие.

На уровне скомпилированного байткода тоже есть небольшие различия: интерфейс помечается флагом ACC_INTERFACE а для класса генерируется конструктор по-умолчанию.

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

#Классы

@javatg
Топ-10 лучших фреймворков и библиотек Java

Чем отличается фреймворк от библиотеки
Фреймворки Java — по сути, блоки предварительно написанного кода, в которые программист может добавлять свой код для решения конкретных проблем. Это каркас программной системы (или подсистемы). Он может включать:

- вспомогательные программы;
- библиотеки кода;
- язык сценариев;
- другое ПО, облегчающее разработку и объединение разных компонентов большого программного проекта.

Обычно объединение происходит за счёт использования единого API. Фреймворки Java сокращают объём написания кода с нуля, который программистам приходится делать, чтобы найти решение.

Библиотеки — это код, предназначенный для решения конкретной проблемы.

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

@javatg
Фитнес-функции и их роль в эволюции архитектуры на Java.

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

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

@javatg
🔥 Полезнейшая Подборка каналов

☕️ Java
@javatg - Java для програмистов
@javachats Java чат
@java_library - книги Java
@android_its Android разработка
@java_quizes - тесты Java
@Java_workit - работа Java
@progersit - шпаргалки ит

💡 Javascript / front
@javascriptv - javascript изучение
@about_javascript - javascript продвинутый
@JavaScript_testit -тесты JS
@htmlcssjavas - web
@hashdev - web разработка

🦾 Machine learning
@ai_machinelearning_big_data – все о машинном обучении
@data_analysis_ml – все о анализе данных.
@machinelearning_ru – машинное обучении на русском от новичка до профессионала.
@machinelearning_interview – подготовка к собеседования Data Science
@datascienceiot – бесплатные книги Machine learning
@ArtificialIntelligencedl – канал о искусственном интеллекте
@neural – все о нейронных сетях
@machinee_learning – чат о машинном обучении
@datascienceml_jobs - работа ds, ml


🦫 Golang
@golang_interview - вопросы и ответы с собеседований по Go. Для всех уровней разработчиков.
@Golang_google - go для разработчиков
@golangtests - тесты и задачи GO
@golangl - чат Golang
@GolangJobsit - вакансии и работа GO
@golang_jobsgo - чат вакансий
@golang_books - книги Golang
@golang_speak - обсуждение задач Go
🐍 Python
@pythonl – python для датасаентиста
@pro_python_code – python на русском
@python_job_interview – подготовка к Python собеседованию
@python_testit тесты на python
@pythonlbooks - книги Python
@Django_pythonl django
@python_djangojobs - работа Python

🐧 Linux
@inux_kal - чат kali linux
@inuxkalii - linux kali
@linux_read - книги linux

👷‍♂️ IT работа

@hr_itwork - ит-ваканнсии

🔋 SQL
@sqlhub - базы данных
@chat_sql - базы данных чат

🤡It memes
@memes_prog - ит-мемы

⚙️ Rust
@rust_code - язык программирования rust
@rust_chats - чат rust

#️⃣ c# c++
@csharp_ci - c# c++кодинг
@csharp_cplus чат
🔎 Распознавание символов на Java

В последнее время задача распознавания символов в прикладных программах не представляет особой сложности — можно использовать множество готовых OCR-библиотек, многие из которых доведены почти до совершенства. Но все же иногда может возникнуть задача разработать свой алгоритм распознавания без использования сторонних «навороченных» OCR-библиотек.

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


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

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

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

@javatg
🔃 Синхронизация потоков. Оператор synchronized

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

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

@javatg
🪞 Рефлексия кода, reflection на Java

Рефлексия (от reflexio - обращение назад) - это механизм исследования данных о программе во время её выполнения. Рефлексия в Java осуществляется с помощью Java Reflection API, состоящий из классов пакетов java.lang и java.lang.reflect. В информатике рефлексия означает процесс, во время которого программа может отслеживать и модифицировать собственную структуру и поведение во время выполнения.

Java Reflection API позволяет получать информацию о конструкторах, методах и полях классов и выполнять следующие операции над полями и методами объекта/класса :

определение класса объекта;
получение информации о полях, методах, конструкторах и суперклассах;
получение информации о модификаторах полей и методов;
создание экземпляра класса, имя которого неизвестно до момента выполнения программы;
определение и изменение значений свойств объекта/класса;
вызов методов объекта/класса.

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

@javatg
Разбираем подробно Java ThreadLocal

Java ThreadLocal используется для создания локальных переменных потока. Мы знаем, что все потоки объекта совместно используют его переменные, поэтому переменная не является потокобезопасной. Мы можем использовать синхронизацию для обеспечения потокобезопасности, но если мы хотим избежать синхронизации, мы можем использовать переменные ThreadLocal .

Класс ThreadLocal представляет хранилище тред-локальных переменных. По способу использования он похож на обычную обертку над значением, с методами get(), set() и remove() для доступа к нему, и дополнительным фабричным методом ThreadLocal.withInitial(), устанавливающим значение по-умолчанию.

Отличие тред-локальной переменной от обычной в том, что ThreadLocal хранит отдельную независимую копию значения для каждого ее использующего потока. Работа с такой переменной потокобезопасна.

Проще говоря, объект класса ThreadLocal хранит внутри не одно значение, а как бы хэш-таблицу поток➝значение, и при использовании обращается к значению для текущего потока.

Первый, самый очевидный вариант использования – данные, относящиеся непосредственно к треду, определенный пользователем «контекст потока». На скриншоте ниже пример такого использования: ThreadId.get() вернет порядковый номер текущего треда.

Другой случай, с которым локальная переменная потока может помочь – кэширование read-only данных в многопоточной среде без дорогостоящей синхронизации.

Помимо обычного ThreadLocal, в стандартной библиотеке присутствует его расширение InheritableThreadLocal. Этот класс «наследует» значение – изначально берет его для потока, являющегося родителем текущего.

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

@javatg
25 самых используемых регулярных выражений в Java

Список из 25 регулярных выражений в Java, без которых не обойтись ни новичку, ни профессиональному разработчику. С примерами.

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

@javatg
Media is too big
VIEW IN TELEGRAM
Ночь бэкендеров в Яндекс Банке

Собеседования — это долго, скучно, иногда мучительно и не всегда понятно. Как вообще можно понять за пару часов, хочешь ли ты работать где-то в ближайшие пару лет? Поэтому в Финтехе Яндекса придумали кое-что получше — препати для тех, кто хочет взять компанию на тест-драйв. Можно бесконечно смотреть отзывы на Хабр Карьере, но лучше один раз увидеть всё своими глазами.

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

Кормить будут. Вкусно. Поить тоже — бар прямо в офисе. А в промежутках между разговорами о невыносимой лёгкости бэкенд-бытия можно будет порубиться в PS5 с коллегами по цеху, выведать все инсайды у продакт-оунера и просто почилить. Если ты не в Москве, собирай чемоданы — ребята не будут дразнить кутежом в зуме, а купят билет и организуют трансфер.

P.S.: дресс-кода нет, но есть задачка с кодом. Если ты действительно бэкендер, то решишь её без труда и приглос у тебя в кармане! Подробности 👉 тут.
Существует ли способ решения проблемы race condition?

Распространённые способы решения:

Использование локальной копии — копирование разделяемой переменной в локальную переменную потока. Этот способ работает только тогда, когда переменная одна и копирование производится атомарно (за одну машинную команду), использование volatile.
Синхронизация - операции над разделяемым ресурсом происходят в синхронизированном блоке (при использовании ключевого слова synchronized).
Комбинирование методов - вышеперечисленные способы можно комбинировать, копируя «опасные» переменные в синхронизированном блоке. С одной стороны, это снимает ограничение на атомарность, с другой — позволяет избавиться от слишком больших синхронизированных блоков.

Очевидных способов выявления и исправления состояний гонки не существует. Лучший способ избавиться от гонок — правильное проектирование многозадачной системы.

@javatg
#Вопросы_с_собеседования

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

Вопрос с подвохом: ConcurrentModificationException к многопоточности никакого отношения не имеет. Возникает эта штука тогда, когда мы пытаемся модифицировать коллекцию во время итерирования по ней.

@javatg
⚙️ Работа с Git: подробная инструкция для новичков

Сегодня поговорим о системе контроля версий, а именно о Git (читается как ГИТ, а не ДЖИТ, как могло бы показаться из грамматики английского языка).

Да-да, я знаю что есть еще и Mercurial, SVN… Но будем откровенны: их время уже ушло, и тратить ваше драгоценное время на них не собираюсь.

Чтобы вы понимали важность знания гита в наше время, скажу так: без знания/понимания этого вам делать в программировании нечего. Но прелесть в том, что для постоянной работы не нужно держать в голове все команды и возможности. Нужно знать набор команд, которые помогут понимать всё, что происходит.


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

@javatg
Компилирование и исполнение Java-кода в Runtime

Сегодня я хотел бы поговорить про динамическое компилирование и исполнение Java-кода, подобно скриптовым языкам программирования. В этой статье вы найдете пошаговое руководство как скомпилировать Java в Bytecode и загрузить новые классы в ClassLoader на лету.

Зачем?
В разработке все чаще возникают типовые задачи, которые можно было бы закрыть простой генерацией кода. Например, сгенерировать DTO классы по имеющейся спецификации по стандартам OpenAPI или AsyncAPI. В целом, для генерации кода нет необходимости компилировать и выполнять код в runtime, ведь можно сгенерировать исходники классов, а собрать уже вместе с проектом. Однако при написании инструментов для генерации кода, было бы не плохо покрыть это тестами. А при проверке самый очевидный сценарий: сгенерировал-скомпилировал-загрузил-проверил-удалил. И вот тут-то и возникает задача генерации и проверки кода "на лету".

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

➡️ Читать дальше
⚙️ Код


@javatg
Вышла Java 19

Вышла общедоступная версия Java 19. В этот релиз попало более двух тысяч закрытых задач и 7 JEP'ов. Release Notes можно посмотреть здесь. Изменения API – здесь.



Ссылки на скачивание:


Oracle JDK
OpenJDK

Вот список JEP'ов, которые попали в Java 19

Паттерн-матчинг для switch (Third Preview) (JEP 427)

Паттерн-матчинг для switch, который появился в Java 17 в режиме preview и остался на второе preview в Java 18, всё ещё остаётся в этом статусе. Это первый случай в Java, когда языковой конструкции не хватило двух релизов, чтобы стать стабильной: ранее все конструкции укладывались в два preview.


В этом релизе в паттерн-матчинг было внесено два главных изменения.

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

@javatg
2024/10/03 23:23:05
Back to Top
HTML Embed Code: