ENUM, nested classes, concurrency Flashcards

1
Q

ENUM instance methods

A

1) compareTo(EnumObj) сравнивает по ordinal-у
2) name() возвращает строковое представление имени перечисления (то же самое происходит при toString())
3) У каждого объекта перечисления есть цифровой уникальный номер, возвращается методом int ordinal() - при смене порядка в самом класс ординал также меняется

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Enum static methods

A

1) Enum[] values() возвращает всех представителей
2) valueOf(String), преобразующий название объекта перечисления в ссылку на объект. Будет выброшено illegalArgumentException если такого значения нет. Чувствителен к регистру.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Особенности статического вложенного класса

A
  • Любая видимость
  • Может обращаться к приватным членам внешнего класса
  • Нэймспейс с внешним членом
    !!!В остальном аналогичен обычному топ-левел классу.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Особенности локального класса

A
  • могут быть объявлены в любом блоке кода (даже в инициализаторе в т.ч. статическом)
  • не могут иметь модификатор видиомсти и по сути видимы только в блоке кода
  • как и обычный внутренний класс не могут иметь статических членов кроме констант
  • как и обычный внутренний метод имеют доступ ко всем членам внешнего класса (если объявлен в статическом блоке кода то только к статическим).
  • могут иметь доступ к эффективно финальным переменным
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Особенности внутреннего класса

A
  • Любая видимость
  • Может обращаться к приватным членам внешнего класса
  • не могут иметь статических членов кроме констант
  • Нэймспейс с внешним членом
  • может быть абстрактным и финальным
  • доступ к this внешнего класса через MyInner.this
  • создание объекта внутреннего класса outerObj.new Inner()
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Особенности анонимного класса

A
  • Может обращаться к приватным членам внешнего класса
  • не могут иметь статических членов кроме констант
  • доступ к this внешнего класса через MyInner.this
  • объявление анонимного класса только одновременно с присваиванием- в конце всегда ;
  • не может иметь конструкторов (можно использовать инициализаторы)
  • не может быть множественное наследование для анонимного класса
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Var аргументы в лямбде

A

Если используется хоть один var для типа аргумента, то остальные тоже должны использовать var

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Может ли быть static метод final

A

В обычном классе может быть. В интерфейсе нет- ошибка компиляции

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Что может быть выражением для сравнения в switch

A
  • целочисленное значение (char, int etc.) кроме long и их враппер классы.
  • строки (используется equals)
  • перечисления(если значение для сравнения null кидает npe) (перечисления при этом в блоке case используются без имени класса ,т.е. BEAR а не Animal.BEAR- иначе ошибка компиляции.
    P.S. var переменные если их тип входит в список разрешенных.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

java.util.concurrent.Future методы isDone,isCancelled, get,cancel

A

boolean isDone() Returns true if the task was completed, threw an exception, or was cancelled

boolean isCancelled() Returns true if the task was cancelled before it completed normally

boolean cancel(boolean mayInterruptIfRunning) Attempts to cancel execution of the task and returns true if it was successfully cancelled or false if it could not be cancelled or is complete

V get() Retrieves the result of a task, waiting endlessly if it is not yet available

V get(long timeout, TimeUnit unit) Retrieves the result of a task, waiting the specified amount of time. If the result is not ready by the time the timeout is reached, a checked TimeoutException will be thrown.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

java.util.concurrent.ExecutorService методы запуска, закрытия и массвого запуска

A

shutDown() прекращает принятие новых заданий(кидает RejectedExecutionException) и закрывает пул когда уже принятые задания завершаются (если не закрыть то создастся вечная нить и программа не завершится).
Но продолжает выполнять уже запущенные задачи (isShutdown вернет true, а isTerminated вернет false). Когда все задачи выполнятся- то перейдет в состояние Terminated.

shutDownNow() пытается закрыть пул и все задачи в данный момент, но не все задачи закрываются,метод возвращает список задач в очереди, которые ,были добавлены в очередь но еще не были запущены.

awaitTermination(время, единицы времени)- ждет завершения задач- и на это время блокирует поток,разблокирует либо при истечении таймаута, либо если все задачи завершаются.

void execute(Runnable)- добавляет задачу в очередь

Future и Future submit (Runnable и Callable) - аналог execute для объектов с интерфейсом Callable, только он возвращает объект Future.
Также call в отличие от run позволяет пробрасывать исключения.

List> invokeAll(Collection> ) синхронно (т.е. поток ждет выполнения метода) запускает все задачи и возвращает будущие результаты всех из них.

T invokeAny(Collection>) синхронно (т.е. поток ждет выполнения метода) запускает все задачи и возвращает результат одной, успешно выполненной (не Future), все остальные не законченные закрывает.
У invokeAll и invokeAny есть перегруженные версии с таймаутом.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

ScheduledThreadPoolExecutor методы

A

-schedule(runnable или callable,inititaldelay,единицы измерения))и с определенным промежутком времени
-scheduleAtFixedRate(runnablel,начальная задержка, преиодическая задержка, единицы измерения)) и -sheduleWithFixedDelay(runnable,начальная задержка (от конца прошлой задачи), преиодическая задержка, единицы измерения))).
Данные методы возвращают SheduledFuture, который имеет дополнительный метод getDelay- возвращаюший оставшееся время до начала выполнения.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

ВИды Executors

A
  • newSingleThreadExecutor- создает одну нить и выполняет задачи по очереди (то есть при запуске трех runnable в данный ексекьютор они будут выполнены по очереди как были добавлены).
  • newFixedThreadPool- создает пул из фиксированного количества нитей.
  • newCachedThreadPool- переиспользует нити, если нитей не хватает- создает новые. Рекомендуется для коротких мало живущих тасок.
  • newScheduledThreadPoolExecutor и newSIngleThreadScheduledExecutor- позволяют запускать задачи с задержкой (методом schedule(runnable или callable,inititaldelay,единицы измерения))и с определенным промежутком времени (scheduleAtFixedRate(runnablel,начальная задержка, преиодическая задержка, единицы измерения)) и sheduleWithFixedDelay(runnable,начальная задержка (от конца прошлой задачи), преиодическая задержка, единицы измерения))). Данные методы возвращают SheduledFuture, который имеет дополнительный метод getDelay- возвращаюший оставшееся время до начала выполнения.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Atomic классы и методы

A

Классы AtomicBoolen AtomicInteger,AtomicLong,AtomicReference - изменяемые классы.
Методы: compareAndSet(предполагаемое значение, новое значение) если текущее значение равно предполагаемому, устанавливает новое.
Методы:
getAndSet(новое значение) устанавливает новое значение возвращая старое
get/set
in/decrementAndGet
getAndIn/Decrement

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Atomic классы и методы

A

Классы AtomicBoolen AtomicInteger,AtomicLong,AtomicReference - изменяемые классы.
Методы:
-compareAndSet(предполагаемое значение, новое значение) если текущее значение равно предполагаемому, устанавливает новое.
-getAndSet(новое значение) устанавливает новое значение возвращая старое
-get/set
-in/decrementAndGet
-getAndIn/Decrement

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Lock и справделивость замка

A

Lock- блокирует содержимое между использованием методов lock() unlock() для повторного использования.
Также содержит метод tryLock() и tryLock(время в лонг, единица измерения времени), который пытается зайти и заблокировать фрагмент кода, если ему это не удается то в течение указанного времени, то он возвращает false и передает управление программе после кода.

ReentrantLock- аналог блока synchronized,т.к. он обеспечивает отсутствие блокировки для одной нити дважды входящей в залоченный блок.

Если незакрытый замок попытаться анлокнуть то будет IllegalStateException

Замки имеют перегруженные конструкторы с booelan значением справедливости (равнодоступности), поток первый затребовавший монитор- первым его и получит (но при этом просадка по перфомансу). По дефолту справедливость = false- значит входит в блок кода рандомный поток.

16
Q

CyclicBarrier

A

CyclicBarrier- более современный чем Phaser баррьер
Имеет два конструктора - с количеством финишей, необходимых для преодоления баррьера, а такжедополнительно с runnable, выполняемом при преодолении барьера. Участники сигнализируют о прибытии методом await и ждут пока баррьер не будет прорван.
Если участников меньше, и поэтому барьер прорвать невозможно, то другие участники будут ждать вечно- дэдлок. При преодолении барьера он автоматом активируется снова- то есть его можно преодолеть много раз подряд.

17
Q

Конкурентные коллекции

A

ConcurrentHashMap, ConcurrentLinkedQueue, ConcurrentLinkedDeque — просто конкуррентные версии Queu,Dequeu, HashMap.
ConcurrentHashMap разделена на сегменты, которые блокируются отдельно, по перфомансу сравнима с обычной хэшмапой.

ConcurrentSkipListSet и ConcurrentSkipListMap- конкурентные версии TreeSet и TreeMap.

18
Q

Блокирующие коллекции и Collestions synchronized методы

A

BlockingQueue (конкретный класс LinkedBlockingQueue)- имеет методы, которые ожидают определенное время перед добавлением, извлечением. Немного похожи на синхронайзд коллекции.
Имеет методы:
offer(E,long timeOut,TimeUnit)- добавляет итем в очередь, при этом ждет определенное время- если таймаут выходит то false
poll(long timeout,TimeUnit)- poll с таймаутом. Возвращает null если таймаут выходит.
Методы с таймаутом кидают interruptedexception.
BlockingDeque (конкретный класс LinkedBlockingDequeue)
Реализует методы pollFirst,pollLast,offerFirst,offerLas с ТаймАутами с логикой аналогичной BlockingQueue.

Collections имеет статические враппер методы, оборачивающие методы в коллекции, все методы которых синхронизированы. ПРи этом добавление.удаление синхронизированной коллекции во время итеарции все равно вызовет ConcurrentMOdificationException.

19
Q

Копирующие коллекции

A

CopyOnWriteArrayList, CopyOnWriteArraySet — создается копия данных при удалении.добавлении замене элемента, при итерации используется неизмененная копия (которая была на момент начала итерации), а редактируется (добавление, удаление) оригинал. Каждый раз при модификации списка, добавляется новая копия. Ресурсозатратно при частых модификациях записи.

20
Q

Параллельность в стримах

A

Любой стрим не параллелен
parallel() или Collection.parallelStream() делают их параллельными.
Любые операции трансформирующие несколько стримов стараюстся сделать непараллельным
Если в конце нужно сделать операцииобратно непараллельными то можно применить forEachOrdered

При использовании параллельных стримов (а лучше и обычных) не стоит использовать stateful лямбды, то есть лямбды которые меняют какую либо внешнюю переменную.

21
Q

Параллельность в reduce и collect

A

reduce функция с тремя аргументами (третий комбайнер) лучше будет себя вести с параллельными стримами чем без комбайнера. Также identity(начальное значение) в параллельном стриме может использоваться несколько раз так как парарелльно может происходить несколько аккумуляций с начальным значением.
collect также лучше предпочесть с комбайнером. Если используем предустановленный колллектор то стоит обратить внимание на его Collector.Characteristics - они должны быть COncurrent и Unordered(либо Unordered установлено для самого стрима)-тогда JVM будет распараллеливать сборку коллектором. Есть два OOTB таких коллектора -toConcurrentMap и groupingByConcurrent