Академический Документы
Профессиональный Документы
Культура Документы
Java core................................................................................................................................................4
ВНУТРЕННИЕ КЛАССЫ (Нестатические вложенные классы - inner)..............................................4
ВЛОЖЕННЫЕ (NESTED) КЛАССЫ – they are static............................................................................5
АНОНИМНЫЕ КЛАССЫ.....................................................................................................................5
ИНТЕРФЕЙСЫ И АННОТАЦИИ..........................................................................................................5
Параметризация интерфейсов....................................................................................................6
Аннотации....................................................................................................................................6
ФУНКЦИОНАЛЬНЫЕ ИНТЕРФЕЙСЫ.................................................................................................7
Методы default и static в интерфейсах.......................................................................................7
Функциональные интерфейсы....................................................................................................7
Функциональный интерфейс как параметр метода..................................................................8
Интерфейс Predicate....................................................................................................................8
Интерфейс Function.....................................................................................................................9
Интерфейс Consumer.................................................................................................................10
Интерфейс Supplier....................................................................................................................10
Интерфейс Comparator..............................................................................................................11
Замыкания..................................................................................................................................11
Ссылки на методы -> ::...............................................................................................................11
СТРОКИ...........................................................................................................................................12
Регулярные выражения.............................................................................................................12
Интернационализация приложения............................................................................................13
Форматирование информации.................................................................................................13
Шифрование и кодирование строк..........................................................................................13
API Date\Time.................................................................................................................................14
ИСКЛЮЧЕНИЯ И ОШИБКИ.............................................................................................................14
Способы обработки исключений..............................................................................................15
Наследование и исключения....................................................................................................16
Ошибки статической инициализации.......................................................................................16
Рекомендации по обработке исключений...............................................................................16
Отладочный механизм assertion...............................................................................................17
ПОТОКИ ВВОДА/ВЫВОДА..............................................................................................................17
Байтовые и символьные потоки ввода/вывода......................................................................17
File, Path и Files...........................................................................................................................19
Чтение из потока........................................................................................................................20
Предопределенные стандартные потоки................................................................................21
Сериализация объектов............................................................................................................21
Сериализация в XML (Java Beans)..............................................................................................22
Класс Scanner..............................................................................................................................23
Архивация...................................................................................................................................23
COLLECTION FRAMEWORK И STREAM API......................................................................................23
ArrayList.......................................................................................................................................24
Iterator........................................................................................................................................24
Stream API...................................................................................................................................25
Алгоритмы сведения Collectors.................................................................................................26
Метасимвол в коллекциях........................................................................................................27
Класс LinkedList и интерфейс Queue.........................................................................................27
Интерфейс Deque и класс ArrayDeque......................................................................................28
Множества..................................................................................................................................28
EnumSet......................................................................................................................................28
Map.............................................................................................................................................28
Multithreading.................................................................................................................................29
Класс Thread и интерфейс Runnable.........................................................................................29
Интерфейс Callable.....................................................................................................................30
Механизм Fork\Join...................................................................................................................30
Parallelism...................................................................................................................................30
Timer и поток TimerTask.............................................................................................................31
Управление потоками................................................................................................................31
Потоки и исключения................................................................................................................31
Атомарные типы и модификатор volatile.................................................................................31
Synchronized...............................................................................................................................31
Монитор.....................................................................................................................................32
Механизм wait\notify.................................................................................................................32
Интерфейс Lock как альтернатива synchronized......................................................................32
Семафор.....................................................................................................................................33
Барьер.........................................................................................................................................33
CountDownLatch или «защелка»...............................................................................................33
Deadlock......................................................................................................................................33
Обмен блокировками................................................................................................................34
Блокирующие очереди..............................................................................................................34
CopyOnWriteArrayList.................................................................................................................34
Java DataBase Connectivity.............................................................................................................34
Java Functional Programming..............................................................................................................35
Database, JDBC....................................................................................................................................36
Hibernate.............................................................................................................................................37
Spring..................................................................................................................................................38
Algorithms and data structures...........................................................................................................39
Logging and testing..............................................................................................................................40
Design patterns....................................................................................................................................41
Version control....................................................................................................................................42
Types of VCS................................................................................................................................42
What is git?..................................................................................................................................42
GIT vs SVN....................................................................................................................................42
Project Build tools...............................................................................................................................44
Development process tools and technologies.....................................................................................45
Cloud technology.................................................................................................................................46
AWS.....................................................................................................................................................47
Multithreading.....................................................................................................................................48
Network – OSI......................................................................................................................................49
Software architecture..........................................................................................................................50
Programming PARADIGM
Structured programming imposes discipline on direct transfer of control.
Object-oriented programming imposes discipline on indirect transfer of control.
Functional programming imposes discipline upon assignment
Java core
АНОНИМНЫЕ КЛАССЫ
Они удобны в том случае, когда необходимо переопределение метода, но
создавать новый класс нет необходимости из-за узкой области или одномоментного
применения объекта;
Анонимные классы, как и остальные внутренние, допускают
вложенность;
Конструктор анонимного класса определить невозможно;
Нельзя создатьанонимный класс для final-класса;
объявление анонимного класса в Enum отличается от простого
анонимного класса, поскольку инициализация всех элементов происходит припервом
обращении к типу; (они испольщуются в enum для отслеживания внутреннего
состояния);
ИНТЕРФЕЙСЫ И АННОТАЦИИ
Параметризация интерфейсов
Применение параметризации при объявлении интерфейсов позволяет избавиться от лишних
проверок и преобразований типов при реализации непосредственно самого интерфейса и
использовании созданных на их основе классов.
Аннотации
@Target(ElementType.TYPE)
public @interface BaseAction {
int level();
String sqlRequest();
}
Использование:
ФУНКЦИОНАЛЬНЫЕ ИНТЕРФЕЙСЫ
Функциональные интерфейсы
Функция как объект создается во время выполнения. Внешне создается впечатление, что в
метод передается функция. На самом деле в функцию передается объект, в который
«завернута» функция.
Интерфейс Predicate
Пример:
Predicate<String> predicateStr1 = s -> s.length() < 2;
Predicate<String> predicateStr2 = String::isBlank;
Predicate<Integer> predicateInt = i -> i >= 9;
НО в явном виде его никто не использует. Чаще всего вот так: filter(Predicate<? super T > predicate)
String[] arrayStr = {"as", "a", "the", " ", "d", "on", "and", ""};
System.out.println(Arrays.stream(arrayStr)
.filter(s -> s.length() > 2)
.collect(Collectors.toList()));
System.out.println(Arrays.stream(arrayStr)
.filter(((Predicate<String>) s -> s.contains("a")).and(s -> s.contains("n")))
.collect(Collectors.toList()));
Для упрощения работы с потоками чисел разработаны предикаты IntPredicate,
DoublePredicate, LongPredicate с практически идентичным набором методов
построения логических выражений.
default Predicate<T> negate() — логическое отрицание предиката.
static Predicate<T> not(Predicate<? super T> target) — более короткий вариант
логического отрицания.
Интерфейс-предикат BiPredicate<T,U> c абстрактным методом boolean test(T t, U u):
Интерфейс Function
Основной абстрактный метод R apply(T t) принимает объект типа T и возвращает объект типа
R. Его задача: выполнить действие над объектом одного типа и возвратить объект другого
типа. Создание объекта Function может выглядеть следующим образом:
System.out.println(Arrays.stream(arrayStr)
.map(s -> s.length())
.collect(Collectors.toList()));
Пример:
System.out.println(Arrays.stream(arrayInt)
.boxed()
.map(((Function<String, Integer>)s -> s.length())
.compose(i -> Integer.toBinaryString(i)))
.collect(Collectors.toList()));
возвращает составную функцию, которая сначала применяет эту функцию к своему входу, а
затем применяет функцию after к результату.
Интерфейс Consumer
Пример:
String str = "as a- the-d -on and";
String regex = "-";
Consumer<String> consumer = s -> System.out.println(Arrays.toString(s.split(regex)));
consumer.accept(str);
Интерфейс Supplier
Интерфейс Supplier<T> возвращает новый объект типа T методом T get(). Предназначен для
создания новых объектов.
Хорошим использованием Supplier может быть генератор случайных чисел или уникальных
идентификаторов на его основе.
Замыкания
Блок кода, представляющий собой лямбда-выражение вместе со значениями локальных
переменных и параметров метода, в котором он объявлен, называется замыканием, или closure.
Объект-функция создается во время исполнения, и применен может быть уже после того как
объект, его создавший, прекратит существование. Такая ситуация требует, чтобы переменные,
которые использует лямбда-выражение, не могли быть изменены. Значения переменных
фиксируются замыканием и изменены быть не могут, эти переменные должны иметь
константные значения, как если бы они были объявлены как final.
Пример:
public class FunctionBuilder<T> {
public static Function<String, Integer> build(String strNum) {
int count = 1;
return t -> {
int res = Integer.valueOf(strNum + t) + count;
return res;
};
}
}
Если пробовать изменить значения strNum и count в методе, то это вызовет ошибку
компиляции при попытке их применения в лямбда-выражении:
public static Function<String, Integer> build(String strNum) {
int count = 1;
++count;
strNum = strNum.concat("1");
return t -> {
int res = Integer.valueOf(strNum + t) + count; // compile error
return res;
};
}
СТРОКИ
Значение объекта класса String после создания не может быть изменено при помощи
любого метода класса.
Изменение строки всегда приводит к созданию нового объекта в heap.
Сама объектная ссылка при этом сохраняет прежнее значение и хранится в стеке.
В Java 8 в классе String (вместо массива символов char) теперь строка хранится в
массиве типа byte, а ее кодировка в отдельном поле.
В случае, если литерал является вычисляемым,то компилятор воспринимает литералы
"Java" и "Ja" + "va" как эквивалентные.
Три двойные кавычки подряд в начале и конце строки гарантируют ее идентичное
сохранение. – Java 15
Основным отличием StringBuilder от StringBuffer является потоко безопасность последнего.
Более высокая скорость обработки есть следствие отсутствия потокобезопасности класса
StringBuilder.
Регулярные выражения
Для определения регулярных выражений недостаточно одних классов символов, т.к. в шаблоне
часто нужно указать количество повторений. Для этого существуют квантификаторы.
Класс Pattern используется для простой обработки строк и объекта хранителя
регулярного выражения. Объект класса Pattern, в свою очередь, используется для
более сложной обработки символьной информации классом Matcher.
Пример:
Pattern pattern = Pattern.compile("x+y");
Matcher matcher = pattern.matcher("xxxy");
boolean res = matcher.matches();
System.out.println(res); // printing true
Интернационализация приложения
Форматирование информации
Для создания форматированного текстового вывода предназначен класс java.util.Formatter.
Этот класс обеспечивает преобразование формата, позволяющее выводить числа, строки,
время и даты в любом необходимом разработчику виде.
Класс Formatter преобразует двоичную форму представления данных в
форматированный текст.
Он сохраняет форматированный текст в буфере, содержимое которого можно получить
в любой момент.
API Date\Time
Основной класс API Date\Time — класс java.time.Instant
Для работы с датами необходим класс java.time.LocalDate, для работы со временем —
java.time.LocalTime, для работы с датой и временем — java.time.LocalDateTime.
ИСКЛЮЧЕНИЯ И ОШИБКИ
Наследование и исключения
Следует знать два правила для проверяемых исключений при наследовании:
~ переопределяемый метод в подклассе не может содержать в инструкции throws
исключений, не обрабатываемых в соответствующем методе суперкласса;
~ конструктор подкласса должен включить в свою секцию throws все классы
исключений или их суперклассы из секции throws конструктора супер класса, к
которому он обращается при создании объекта (не расспространяется на
методы).
Выражение bool_exp может принимать только значение типов boolean или Boolean, а
expression — любое значение, которое может быть преобразовано к строке.
Если логическое выражение получает значение false, то генерируется исключение
AssertionError и выполнение программы прекращается с выводом на консоль значения
выражения expression (если оно задано).
Механизм assertion можно включать для отдельных классов или пакетов при запуске
виртуальной машины в виде:
java -enableassertions RunnerMain
или
java -ea RunnerMain
ПОТОКИ ВВОДА/ВЫВОДА
Потоки ввода/вывода используются для передачи данных в файловые потоки, на консоль или
на сетевые соединения.
Найти все файлы с расширением .java из заданной директории src с помощью метода
Files.find:
Чтение из потока
Для ввода используется не байтовый, а символьный поток. В этой ситуации для ввода
используется подкласс BufferedReader абстрактного класса Reader и методы read() и
readLine() для чтения символа и строки соответственно. Этот поток для организации
чтения из файла лучше всего инициализировать объектом класса FileReader в виде:
BufferedReader reader = new BufferedReader(new FileReader(new File("data\\res.txt")));
//считывание
String tmp;
while ((tmp = reader.readLine()) != null) { //java 2
//display or something
}
В Java 7 в классе Files появился метод readAllLines(), считывающий сразу весь файл в
список строк:
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
*По окончании работы с потоками закрывать следует только самый последний класс, все
остальные, в него обернутые, будут закрыты автоматически.
Класс System пакета java.lang содержит поля out, err — ссылки на объекты байтового
потока PrintStream, объявленные со спецификаторами public static, являющиеся
стандартными потоками ввода, вывода и вывода ошибок соответственно. Они связаны
с консолью, но могут быть переназначены на другое устройство:
double[] values = {14.10, 17};
try(PrintStream stream = new PrintStream(new FileOutputStream("data\\res.txt"))){
for (double value: values) {
stream.printf("Java %.2g%n", value);
System.setOut(stream);
System.out.printf("%.2g%n", value); // вывод пойдет не в консоль, а в файл!!!:)
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Сериализация объектов
Процесс преобразования объектов в потоки байтов для хранения называется
сериализацией.
Процесс извлечения объекта из потока байтов называется десериализацией.
Существует два способа сделать объект сериализуемым:
1. Класс должен имплементировать интерфейс java.io.Serializable.
~ Все подклассы такого класса также будут сериализованы.
~ Поля типа transient и static не сериализируются! При десериализации
transient получит default значения, а static получает значение по умолчанию
в случае отсутствия в области видимости объектов своего типа, а при их
наличии получает значение, которое определено для существующего
объекта.
~ На поля, помеченные как final, ключевое слово transient не действует.
~ Для записи объектов в поток необходимо использовать класс
ObjectOutputStream (метод сериализации writeObject(Object ob)).
~ Для чтения используются, соответственно, класс ObjectInputStream и его
метод readObject(), возвращающий ссылку на класс Object.
~ Конструктор сериализуемого класса при десериализации не вызывается, но
вызываются все конструкторы суперклассов в заданной последовательности
до класса, имплементирующего Serializable.
~ Если полем класса является ссылка на другой тип, то необходимо, чтобы
агрегированный тип также реализовывал интерфейс Serializable, иначе при
попытке сериализации объекта такого класса будет сгенерировано
исключение NotSerializableException.
~ При сериализации объекта класса, реализующего интерфейс Serializable,
учитывается порядок объявления полей в классе, методы могут менять
порядок.
~ private static final long serialVersionUID - Это поле записывается в поток
при сериализации класса. Это тот случай, когда static-поле сериализуется.
При десериализации значение этого поля сравнивается с имеющимся у
класса в виртуальной машине. Если значения не совпадают, инициируется
исключение java.io.InvalidClassException. Соответственно, при любом
изменении в первую очередь полей класса значение поля serialVersionUID
должно быть изменено программистом или генератором.
2. Реализовать Externalizable.
~ При использовании этого интерфейса в поток автоматически записывается
только идентификация класса. Сохранить и восстановить всю информацию
о состоянии экземпляра должен сам класс. Для этого в нем должны быть
переопределены методы writeExternal() и readExternal() интерфейса
Externalizable.
~ При восстановлении Externalizable-объекта экземпляр создается путем
вызова конструктора без аргументов (нужно убедиться что он есть).
Класс Scanner
Объект класса java.util.Scanner принимает форматированный объект или ввод из потока и
преобразует его в двоичное представление.Ончитает лексемы из источника, указанного в
конструкторе, например, из строки или файла. Лексема — это набор символов, выделенный
набором разделителей (по умолчанию пробельными символами).
В этом классе широкий пул методов на проверку того что мы сейчас планируем считать и того
что уже считали.
Архивация
Для хранения классов языка Java и связанных с ними ресурсов в языке Java
используются сжатые архивные jar-файлы.
Для работы с архивами в спецификации Java существуют два пакета — java.util.zip и
java.util.jar, соответственно для архивов zip и jar.
Класс JarFile обеспечивает гибкий доступ к записям, хранящимся в jar-файле:
String dirName = "name_of_directory";
try {
PackJar packJar = new PackJar("example.jar");
packJar.pack(dirName);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Появление Stream API обусловило возникновение методов для создания потоков объектов и
работы с функциональными интерфейсами.
default Stream<E> stream() — преобразует коллекцию в stream объектов;
default Stream<E> parallelStream() — преобразует коллекцию в параллельный stream
объектов. Повышает производительность при работе с очень большими коллекциями на
многоядерных процессорах.
ArrayList
Удаление и добавление элементов для такой коллекции представляет ресурсоемкую задачу,
поэтому объект ArrayList<E> лучше всего подходит для хранения списков с малым числом
подобных действий. С другой стороны, навигация по списку осуществляется очень быстро,
поэтому операции поиска производятся за более короткое время.
В Java 8 в arrayList было добавлено: Метод of() выполняет задачу создания коллекции, с
которой нельзя выполнить операции по добавлению\удалению элементов. Этот метод
добавляет еще один способ создания немодифицируемой коллекции, в частности, для
поддержки принципа инкапсуляции. Метод copyOf() создает немодифицируемую коллекцию
на основе модифицируемой исходной.
Iterator
Для доступа к элементам списка может также использоваться специализированный интерфейс
ListIterator<E>, который позволяет получить доступ сразу в необходимую позицию списка
вызовом метода listIterator(int index) на объекте списка. Интерфейс ListIterator<E>
расширяет интерфейс Iterator<E>, предназначен для обработки списков и их вариаций.
Наличие методов E previous(), int previousIndex() и boolean hasPrevious() обеспечивает
обратную навигацию по списку. Метод int nextIndex() возвращает номер следующего
итератора.
Stream API
Невозможно на одном и том же состоянии объекта stream вызвать метод его обработки
повторно:
/* # 12 # ошибочное использование stream # */
Метасимвол в коллекциях
Метасимволы используются при параметризации коллекций для расширения
возможностей самой коллекции и обеспечения ее типобезопасности.
Добавление к спискам, параметризованным метасимволом с применением extends,
запрещено всегда;
Параметризация List<? super Order> утверждает, что параметр метода или
возвращаемое значение может получить список типа Order или любого из его
суперклассов, в то же время разрешает добавлять туда экземпляры класса Order и
любых его подклассов.
Множества
Интерфейс SortedSet<E> наследует Set<E> и объявляет поведение набора,
oтсортированного в возрастающем порядке, заранее определенном для класса.
Интерфейс NavigableSet<E> существенно облегчает поиск элементов, например,
расположенных рядом с заданным.
Класс TreeSet<E> для хранения объектов использует бинарное (красно-черное) дерево.
EnumSet
Предназначено только для работы с Enum.
Внутренне множество представимо в виде вектора битов, обычно единственного long.
Множества нумераторов поддерживают перебор по диапазону из нумераторов.
Скорость выполнения операций над таким множеством очень высока, даже если в ней
участвует большое количество элементов.
Основное назначение множества EnumSet<E> — это выделение подмножества из
полного набора элементов перечисления.
Создать объект этогокласса можно только с помощью статических методов/
Map
Карта отображений — это объект, который хранит пару «ключ–значение».
Классы карт отображений:
~ AbstractMap<K, V> — реализует интерфейс Map<K, V>, является супер-
классом для всех перечисленных карт отображений;
~ HashMap<K, V> — использует хэш-таблицу для работы с ключами;
~ TreeMap<K, V> — использует дерево, где ключи расположены в виде дерева
поиска в определенном порядке;
~ WeakHashMap<K, V> — позволяет механизму сборки мусора удалять из
карты значения по ключу, ссылка на который вышла из области видимости
приложения; Коллекция WeakHashMap сама будет заботиться об удалении
неактуальных объектов, утративших ссылку на внешний ключ.
~ LinkedHashMap<K, V> — образует дважды связанный список ключей. Этот
механизм эффективен, только если превышен коэффициент загруженности
карты при работе с кэш-памятью и др.
Multithreading
Механизм Fork\Join
Планировщик ForkJoinPool распределяет задания между запущенными потоками. Реализуется
стратегия «разделяй и властвуй»: очень большая задача делится на более мелкие подзадачи,
которые, в свою очередь, могут делиться на еще более мелкие, рекурсивно, до тех пор, пока не
будет получена маленькая задача, которая уже может решаться непосредственно. Далее весь
пул мелких задач выполняется параллельно на процессорных ядрах. Результаты каждой задачи
«объединяются» при получении общего результата.
Этот механизм еще называют «воровство работы», что позволяет использовать
ограниченное число потоков более производитель но по сравнению с другими
реализациями ExecutorService. Все потоки, созданные ForkJoinPool, запущены как
потоки-демоны (это потоки для фоновых действий по обслуживанию основных
потоков. Тред создается демоном, если его родитель демон. Свойство Java
треда isDaemon можно переключать в любой момент до старта потока.)
Потоки не-демоны называются пользовательскими (user thread). По сравнению с
пользовательскими потоками демоны имеют меньший приоритет выполнения.
Демоны не выполняют самостоятельных задач, поэтому не препятствуют остановке,
программа завершается не дожидаясь окончания их работы.
Daemon thread может быть полезен для таких действий, как инвалидация кэша,
периодическая актуализация значений из внешних источников, освобождение
неиспользуемых пользовательских ресурсов.
Aбстрактный класс ForkJoinTask представляет основные final-методы:
~ ForkJoinTask <V> fork() — отправляет задачу для асинхронного выполнения. Этот
метод возвращает текущий объект ForkJoinTask, а вызывающий его поток продолжает
работать;
~ V join() — ожидает выполнения задачи и возвращает результат;
~ V invoke() — объединяет fork() и join() в одном вызове. Он запускает задачу, ожидает
ее завершения и возвращает результат. Существует статический метод invokeAll() для
запуска нескольких задач одновременно.
Parallelism
В Java 8 вместе со Stream API было введено понятие параллелизма, которое
иcпользует ForkJoinPool неявно. Задача будет выполняться вызовом метода parallel() сразу же
после создания stream или создавая его непосредственно методом parallelStream().
long result = LongStream.range(0, 1_000_000_000).boxed().parallel().map(x -> x / 7).peek(v ->
System.out.println(Thread.currentThread().getName())).reduce((x,y)-> x + (int) (3 * Math.sin(y))).get();
System.out.println(result);
Timer и поток TimerTask
Запуск на выполнение задач в заданное время или с определенной периодичностью
представляет собой типичное использование потоков.
Пример использования: В задаче контроля и устранения утечек из пулов соединений с БД поток-таймер может
выполнять несколько различных задач. Основная — проверка целостности пула: если число активных соединений
не совпадает с заявленным размером пула, то таймер может добавить новые соединения. Если стратегия
пула зависит от его загруженности, то таймер может управлять числом активных соединений, а именно:
закрывать часть соединений при низкой нагрузке на БД и увеличивать их число при повышении нагрузки, не выходя
при этом запредельные значения размеров пула.
Прервать выполнение задания можно методом cancel() класса Timer.
Удалить все прерванные задания из очереди таймера — методом purge().
Управление потоками
Приостановить (задержать) выполнение потока можно с помощью метода
static void sleep(int millis) класса Thread. Поток переходит в состояние TIMED_WAITING.
static void yield() - отдает квант времени другому потоку, не мешая самому потоку
работать и предоставляя возможность виртуальной машине переместить его в конец
очереди других потоков.
Метод join() блокирует работу потока, в котором он вызван до тех пор, пока не будет
закончено выполнение вызывающего метод потока или не истечет время ожидания при
обращении к методу join(long timeout).
Потоки и исключения
«Основной» поток избавлен от необходимости обрабатывать исключения в
порожденных потоках. Верно и обратное: если «основной» поток прекратит свое
выполнение из-за необработанного исключения, то это никак не скажется на
работоспособности порожденного им потока.
Synchronized
Синхронизировать объект можно не только при помощи методов с соответствующим
модификатором, но и при помощи синхронизированного блока кода. В этом случае
происходит блокировка объекта, указанного в инструкции synchronized(reference)
{/*code*/}, и он становится недоступным для других синхронизированных методов и
блоков.
Блок синхронизации позволяет сузить область синхронизации, т.е. вывести за пределы
синхронизации код, в ней не нуждающийся. Один из потоков блокирует объект, и до
тех пор, пока он не закончит выполнение блока синхронизации, в котором
производится изменение значения объекта, ни один другой поток не может вызвать
синхронизированный блок для этого объекта.
Монитор
Контроль за доступом к объекту-ресурсу обеспечивает понятие монитора. Монитор экземпляра
может иметь только одного владельца.
Каждый экземпляр любого класса имеет монитор.
Статический synchronized метод захватывает монитор экземпляра класса Class, того класса, на
котором он вызван. Существует в единственном экземпляре. Нестатический synchronized
метод захватывает монитор экземпляра класса, на котором он вызван.
Механизм wait\notify
Эти методы используются для управления потоками в ситуации, когда необходимо задать
определенную последовательность действий без повторного запуска потоков.
Попытка обращения к данным методам вне синхронизации или на несинхронизированном
объекте (со свободным монитором) приводит к генерации исключительной ситуации
IllegalMonitorStateException.
Метод wait(), вызванный внутри синхронизированного блока или метода, останавливает
выполнение текущего потока и освобождает от блокировки захваченный объект. Возвратить
блокировку объекта потоку можно вызовом метода notify() для одного потока или notifyAll()
для всех потоков.
Вызов метода notifyAll() приведет к тому, что в момент вызова уведомления о возможном
снятии блокировки получат все потоки, остановленные методом wait() на этом объекте.
Семафор
В Java существуют способы управления группами потоков, объединенные общим названием
семафор, а именно: такие классы-барьеры синхронизации, как:
~ CountDownLatch — заставляет потоки ожидать завершения заданного числа операций,
по окончании чего все ожидающие потоки освобождаются;
~ Semaphore — предлагает потоку ожидать завершения действий в других
потоках;
~ CyclicBarrier — предлагает нескольким потокам ожидать момента, когда они все
достигнут какой-либо точки, после чего барьер снимается;
~ Phaser — барьер, контракт которого является расширением возможностей
CyclicBarrier, а также частично согласовывается с возможностями CountDownLatch.
Метод acquire() не пропустит поток до тех пор, пока счетчик семафора имеет
значение ноль.
Барьер
Если определена задача задержать заданное число потоков до достижения ими определенной
точки синхронизации, то используются классы-барьеры.
Deadlock
Наглядный пример взаимной блокировки состоит в следующем: поток № 1 заблокировал
объект А, поток № 2 заблокировал объект B. Далее поток № 1 пытается получить доступ к
объекту B и блокируется, так как объект B уже занят потоком № 2. В свою очередь, поток № 2
пытается получить доступ к объекту А и блокируется, так как объект А уже занят потоком №1.
В итоге оба потока заблокировали друг друга.
Обмен блокировками
Ситуации с необходимостью обмена объектами при их взаимном блокировании возникают, для
решения разработан класс Exchanger, предоставляющий возможность безопасного обмена
объектами, в том числе и синхронизированными. Функционал обмена представляет метод T
exchange(T ob). Возвращаемый параметр метода — объект, который будет принят из другого
потока, передаваемый параметр ob метода — собственный объект потока, который помещается
в буфер обмена и будет отдан другому потоку. Процесс обмена завершится успешно только в
случае, если два потока вызовут метод exchange() на одном и том же объекте Exchanger.
Блокирующие очереди
Блокирующие очереди BlockingQueue и BlockingDeque гарантируют остановку потока,
запрашивающего элемент из пустой очереди до появления в ней элемента, доступного для
извлечения, а также блокирующего поток, пытающийся вставить элемент в заполненную
очередь до тех пор, пока в очереди не освободится позиция.
Реализации интерфейсов BlockingQueue и BlockingDeque предлагают методы по
добавлению/извлечению элементов с задержками, а именно:
CopyOnWriteArrayList
Коллекции CopyOnWriteArrayList и CopyOnWriteArraySet копируют свое содержимое при
попытке его изменения, причем ранее полученный итератор будет корректно продолжать
работать с исходным набором данных.
// помогает обойти ConcurrentModificationException.
API JDBC (Java DataBase Connectivity) — стандартный прикладной интер-фейс языка Java для
организации взаимодействия между приложением и СУБД.
В настоящий момент JDBC выделены три типа драйверов:
1. Драйвер, представляющий собой частично библиотеку Java, работающий через native
библиотеки для взаимодействия с клиентом СУБД. (Приложение выполняется на сервере,
который не предполагает установки клиента СУБД).
2. Драйвер только на основе Java, работающий по сетевому и независимому от СУБД
протоколу, который, в свою очередь, подключается к клиенту СУБД.
3. Сетевой драйвер, состоящий только из библиотеки Java, работающий напрямую с клиентом
СУБД. (работает напрямую с СУБД по ее протоколу, более эффективный с точки зрения
производительности)
Компьютерные сети
Компьютерная сеть — это совокупность компьютеров и устройств, соединенных помощью
каналов связи в единую систему так, что они могут связываться между собой и совместно
использовать ресурсы сети. Самой простой является классификация компьютерных сетей
локальных (LAN) и глобальных (WAN).
LAN (Local Area Network) или ЛВС (локальные вычислительные сети), представляют
объединение компьютеров, расположенных на небольших расстояниях и имеющих замкнутую
инфраструктуру до выхода в глобальную сеть.
WAN (Wide Area Network) — глобальные компьютерные сети, которые часто рассматривают
как сети сетей, могут объединять сети на уровне континентов и государств. К глобальным
сетям относится сеть интернет.
Сеть VPN
Если необходимо объединить в сеть некоторое множество компьютеров пользователей, можно
использовать VPN (Virtгal Privаte Network) — виртуальную частную сеть. VPN обеспечивает
локальную сеть поверх глобальной сети.
Традиционный подход к развертыванию виртуальной частной сети заключается в том,
что в корпоративной сети создается и конфигурируется VPN-сервер и удаленные
пользователи заходят в корпоративную сеть по VPN-соединениям.
Преимущество VPN-сети заключает ся в том, что она защищена от
несанкционированного вмешательства и невидима из интернета, хотя и существует в
нем.
Модели OSI
Модели OSI сетевые функции распределены между семью уровнями:
7. Прикладной уровень;
6. Представительский уровень;
5. Сеансовый уровень;
4. Транспортный уровень;
3. Сетевой уровень;
2. Канальный уровень;
1. Физический уровень.
Нижние уровни — Физический и Канальный — определяют физическую среду для передачи
данных через плату сетевого адаптера и кабель. Самые верхние уровни определяют, каким
способом осуществляется доступ приложений к услугам связи. Каждый уровень выполняет
несколько операций. Еще до принятия модели OSI в сети уже использовался стек протоколов
TCP/IP, разработанный ранее в рамках проекта ARPANet. Стек протоколов TCP/IP широко
используется и в настоящее время в сети интернет. Стек протоколов TCP/IP включает в себя
протоколы четырех уровней: прикладного, транспортного, сетевого и канального.
7. Прикладной уровень — HTTP, RTP, FTP, DNS;
4. Транспортный уровень — TCP, UDP, SCTP, DCCP;
3. Сетевой уровень — IP и вспомогательные протоколы ICMP и IGMP;
2. Канальный уровень — Ethernet, SLIP, Token Ring, ATM и MPLS.