Библиотека Java разработчика. Книги по программированию на Java.
ReadWriteLock предоставляет потокобезопасный разделенный доступ на чтение и на запись. Для этих целей в нём объявлены два метода: readLock() и writeLock(). Они возвращают объекты под интерфейсом Lock.
Оба типа блокировок одного экземпляра ReadWriteLock связаны. Пока какой-то поток не заберет блокировку на запись, сколько угодно потоков могут читать не мешая друг другу. Блокировкой readLock закрывается часть кода с семантикой «только чтения» некоторого условного «ресурса». В критической секции кода writeLock осуществляется модификация ресурса.
Свойства этих локов защищают программу от ситуаций конкурентной записи ресурса и чтения во время записи. Подобно copy-on-write коллекциям, этот подход становится выгодным, когда ресурс читают сильно чаще чем модифицируют.
Интерфейс реализуется классом ReentrantReadWriteLock, который во многом похож на обычный ReentrantLock.
👉@BookJavaРеклама. Информация о рекламодателе на сайте otus.rupublic static double abs(double value) {
if (value < 0) {
return -value;
}
return value;
}
bookflow.ru/nelzya-…nachenie
👉@BookJavastatic import обязана располагаться там же, где и обычные импорты – обязательно между package и объявлением основного класса файла.
👉@BookJava• Reader - абстрактный класс, описывающий символьный ввод;
• BufferedReader - буферизованный входной символьный поток;
• CharArrayReader - входной поток, который читает из символьного массива;
• FileReader - входной поток, читающий файл;
• FilterReader - абстрактный класс, предоставляющий интерфейс для классов-надстроек;
• InputStreamReader - входной поток, транслирующий байты в символы;
• LineNumberReader - входной поток, подсчитывающий строки;
• PipedReader - входной канал;
• PushbackReader - входной поток, позволяющий возвращать символы обратно в поток;
• StringReader - входной поток, читающий из строки.
👉@BookJava new. Можно совместить эти два действия, и создать экземпляр анонимного класса.
Основное преимущество, которое дает функциональный интерфейс – два дополнительных способа инициализации параметров и переменных.
1. Лямбда-выражение: (x, y) -> x * y
2. Ссылка на метод: Math::sqrt
На эти способы накладывается небольшое ограничение: тип функционального параметра/переменной должен быть указан явно. Это значит, что лямбдой или метод-референсом нельзя инициализировать переменную, объявленную ключевым словом var. Также, чтобы передать лямбду или референс в параметр generic-типа, этот тип должен быть ограничен функциональным интерфейсом (должен стираться в него).
👉@BookJava