Рубрики
Без рубрики

Избегайте ошибок многопоточности, используя неизменяемые записи Java

В многопоточном Java-приложении любой поток может изменять состояние объекта. Модель памяти Java… С тегами java, java 16, производительность, программирование.

В многопоточном Java-приложении любой поток может изменять состояние объекта. Java memory model в спецификации языка Java указывает, когда именно обновления, сделанные одним потоком, будут видны другим потокам. Это одна из самых больших проблем, с которыми профессиональные разработчики java сталкиваются каждый день. Записи Java неизменяемы, объект считается неизменяемым, если его состояние не может измениться после его создания. Неизменяемый характер записи устраняет проблемы, связанные с ее использованием в многопоточной среде.

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

Функции языка Java, делающие запись неизменяемой

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

1 Создайте подкласс записи и измените состояние подкласса. Классы записей неявно являются окончательными и не могут быть абстрактными, таким образом, мы не можем создать подкласс класса записей.
2 Расширьте какой-нибудь другой класс (суперкласс) и измените состояние суперкласса. Все классы записей расширяют java.lang. Запись по умолчанию, поэтому не может расширять какой-либо другой класс.
3 Добавьте поля экземпляра, которые можно изменять. Классы записей не могут объявлять поля экземпляра.
4 Обновите компоненты записи. Мы не можем присвоить новое значение компонентам записи, поскольку они неявно являются окончательными. Им присваиваются значения при инициализации записи в каноническом конструкторе.
5 Обновите компоненты записи в конструкторе. Только канонический конструктор может обновлять компоненты записи, который вызывается при инициализации записи. Для конструкторов других типов назначение любого из компонентов записи в теле конструктора приводит к ошибке во время компиляции.
6 Обновите компоненты записи с помощью отражения. Компоненты записи имеют специфическую обработку в API полей отражения. Это лечение похоже на скрытые классы. Вы можете прочитать больше о скрытых классах здесь.

Поверхностно неизменный

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

public class EmployeeTest {

    public static void main(String[] args) {
        List integerList = new ArrayList<>();
        integerList.add(1);
        IntegerListRecord integerListRecord = new IntegerListRecord(integerList);

        System.out.println(integerListRecord.getListSize());

        integerList.add(2);
        System.out.println(integerListRecord.getListSize());
    }
}

    record IntegerListRecord(List integerList) {
        int getListSize()
        {
            return integerList.size();
        }
    }

В этом примере мы создали список целых чисел (integer List), добавили в него один элемент и инициализировали этим класс записи. Вызывающий метод возвращает размер списка результатов класса записей в 1. Теперь мы добавляем еще один элемент в список целых чисел и вызываем getList Size, который приводит к 2. Здесь мы не меняли компонент записи (список целых чисел), но обновили поля компонента записи, который не имеет никаких ограничений. Именно по этой причине мы называем запись неглубоко неизменяемой.

Вывод

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

Если вы хотите получить потрясающую работу на Java, я написал электронную книгу 5 шагов к лучшей работе на Java . Вы можете скачать это пошаговое руководство бесплатно!

Ресурсы

  1. ДЖИП 395
  2. ДЖИП 395
  3. Спецификация языка Java: Модель памяти Java
  4. Отражение Полевой API Javadoc .

Оригинал: “https://dev.to/vipin_sharma/avoid-multi-threading-bugs-using-immutable-java-records-3ha”