1/15
Name | Mastery | Learn | Test | Matching | Spaced |
---|
No study sessions yet.
Синхронизация
Механизм, который позволяет безопасно работать с данными в многопоточной программе.
Примеры синхронизации в Java
synchronized, ReentrantLock, volatile, atomic типы данных, барьеры из concurrent.
Состояние гонки (Race Condition)
Ситуация, когда несколько потоков одновременно получают доступ к одному и тому же ресурсу, и результат зависит от порядка их выполнения.
Приоритет потока
Числовое значение от 1 до 10, задающее важность потока для планировщика потоков. Влияет на то, какой поток займёт процессор первым. По умолчанию у потоков приоритет 5.
Монитор synchronized блоков
У статического блока монитором является объект типа класс, соответствующий классу, в котором определён метод. У нестатического - this
.
Метод Thread.join()
Текущий поток (вызвавший join()
) останавливается и ждёт, пока другой поток (на котором вызвали join()
) не завершится.
Методы wait()
и notify()
wait()
выпускает монитор и переходит в режим ожидания, пока кто-то не вызовет notify()
на том же объекте.
Методы stop()
, interrupt()
, interrupted()
, isInterrupted()
stop()
- Жёстко завершает поток (устарел и опасен!). interrupt()
- Просит поток прерваться, ставит флаг прерывания. interrupted()
- Проверяет и сбрасывает флаг прерывания текущего потока. isInterrupted()
- Проверяет, установлен ли флаг прерывания у конкретного потока.
Монитор
Механизм, который обеспечивает взаимное исключение (mutual exclusion) и координацию потоков. В Java каждый объект имеет встроенный монитор. Можно сказать: монитор - это охранник объекта, который пускает внутрь только одного потока за раз.
ConcurrentHashMap
Потокобезопасная версия HashMap, делит бакеты на сегменты, благодаря чему при взаимодействии потока с мапой блокируется один сегмент, а остальные остаются свободными для потоков.
CopyOnWriteArrayList
Потокобезопасный аналог ArrayList, при изменении листа создаётся новая его копия. Подходит для ситуаций, где много чтений и мало изменений.
CopyOnWriteArraySet
То же самое, что и CopyOnWriteArrayList, но содержит в себе только уникальные значения. Не даёт исключение ConcurrentModificationException.
Иерархия интерфейсов Queue
Queue
-> BlockingQueue
, TransferQueue
, BlockingQueue
-> BlockingDeque
, от кью ConcurrentLinkedQueue
, трансфер кью LinkedTransferQueue
, блокинг дек LinkedBlockingDeque
.
blocking queues
array blocking queue имеет фиксированный размер, элементы в массиве и блокирует припереполнении linked blocking queue элементы в связанном списке, можно задать размер, по умолчанию почти бесконечная priority blocking aueue не ограничена по размеру, а элементы упорядочены по приоритету (comparable, comparator) delay queue элементы доступны после задержки symchronous queue сделав пут ждёт тэйк, без буфера linked transfer queue поддерживает трансфер, отдаёт элемент сразу, если потребитель ждёт, не добавляя его в очередь concurrent linked queue неблокирующая, на связанном списке, но без ожидания полл оффер
locks
condition - альтернативна вэйт нотифай, позволяет иметь несколько вэйт на объект lock альтернатива синхронзайзд, лочится вручную readwritelock имеет пару локов, один для чтения и другой для записи reentrant lock альтернатива синхронайзд, но один потомк может захватывать замок несколько раз, счётчик блокировок увеличивается stamped lock имеет три типа блокировки readlock() на чтение writelock() на запись optimisticread() без блокировки все они возвращают штамп, который впоследующем надо передать в метод для разблокировки unlock
ReentrantReadWriteLock
позволяет нескольким потокам читать одновременно, а писать можно только одному подходит, когда много операций чтения и мало изменений несколько потоков могут читать и, если придёт поток писатель, он будет ждать пока те дочитают и наоборот