Многопоточность

Содержание

Слайд 2

www.andersenlab.com Процесс и поток Thread, Runnable, Callable, Object Модель памяти в

www.andersenlab.com

Процесс и поток
Thread, Runnable, Callable, Object
Модель памяти в Java, Happens

Before
Проблемы многопоточности
Synchronized, volatile
Concurrent
Коллекции
Атомики
Локи
Синхронизаторы

План

Слайд 3

www.andersenlab.com Процесс и поток https://habr.com/ru/post/164487/ Процесс - это совокупность кода и

www.andersenlab.com

Процесс и поток

https://habr.com/ru/post/164487/

Процесс - это совокупность кода и данных, разделяющих

общее виртуальное адресное пространство.
Поток - это одна единица исполнения кода. Каждый поток последовательно выполняет инструкции процесса, которому он принадлежит, параллельно с другими потоками этого процесса.
Слайд 4

www.andersenlab.com Thread, runnable, callable, object https://habr.com/ru/post/164487/

www.andersenlab.com

Thread, runnable, callable, object

https://habr.com/ru/post/164487/

Слайд 5

www.andersenlab.com Thread, runnable, callable, object

www.andersenlab.com

Thread, runnable, callable, object

Слайд 6

www.andersenlab.com

www.andersenlab.com

Слайд 7

www.andersenlab.com Модель памяти Java https://habr.com/ru/post/133981/ Модель памяти Java (англ. Java Memory

www.andersenlab.com

Модель памяти Java

https://habr.com/ru/post/133981/

Модель памяти Java (англ. Java Memory Model, JMM)

описывает поведение потоков в среде исполнения Java. Модель памяти — часть семантики языка Java, и описывает, на что может и на что не должен рассчитывать программист, разрабатывающий ПО не для конкретной Java-машины, а для Java в целом.
Свойства:
Атомарность
Видимость
Изменение порядка
Слайд 8

www.andersenlab.com Happens Before http://www.javaspecialist.ru/2011/06/java-memory-model.html В рамках одного поток любая операция happens-before

www.andersenlab.com

Happens Before

http://www.javaspecialist.ru/2011/06/java-memory-model.html

В рамках одного поток любая операция happens-before любой операцией

следующей за ней в исходном коде
Освобождение лока (unlock) happens-before захват того же лока (lock)
Выход из synhronized блока/метода happens-before вход в synhronized блок/метод на том же мониторе
Запись volatile поля happens-before чтение того же самого volatile поля
Запись значения в final-поле (и, если это поле — ссылка, то ещё и всех переменных, достижимых из этого поля (dereference-chain)) при конструировании объекта happens-before запись этого объекта в какую-либо переменную, происходящая вне этого конструктора.
Завершение метода run экземпляра класса Thread happens-before выход из метода join() или возвращение false методом isAlive() экземпляром того же треда
Вызов метода start() экземпляра класса Thread happens-before начало метода run() экземпляра того же треда
Завершение конструктора happens-before начало метода finalize() этого класса
Вызов метода interrupt() на потоке happens-before когда поток обнаружил, что данный метод был вызван либо путем выбрасывания исключения InterruptedException, либо с помощью методов isInterrupted() или interrupted()
Слайд 9

www.andersenlab.com Проблемы многопоточности https://habr.com/ru/company/otus/blog/549814/ Состояние гонки Deadlock Livelock Starvation

www.andersenlab.com

Проблемы многопоточности

https://habr.com/ru/company/otus/blog/549814/

Состояние гонки
Deadlock
Livelock
Starvation

Слайд 10

www.andersenlab.com Synchronized, volatile https://habr.com/ru/post/108016/ Монитор (мьютекс) - абстракция, используемая для синхронизации

www.andersenlab.com

Synchronized, volatile

https://habr.com/ru/post/108016/

Монитор (мьютекс) - абстракция, используемая для синхронизации потоков.
Synchronized -

ключевое слово обозначающее что для исполнения данного участка кода требуется монитор объекта.
Volatile - ключевое слово, которое добавляет атомарность при операциях чтения/записи, а так же дает гарантию что данные будут сохраняться и читаться в/из памяти, а не из кеша
Слайд 11

www.andersenlab.com

www.andersenlab.com

Слайд 12

www.andersenlab.com Пакет Concurrent https://java-online.ru/concurrent-collections.xhtml ConcurrentHashMap коллекция типа HashMap, реализующая интерфейс ConcurrentMap;

www.andersenlab.com

Пакет Concurrent

https://java-online.ru/concurrent-collections.xhtml

ConcurrentHashMap коллекция типа HashMap, реализующая интерфейс ConcurrentMap;
CopyOnWriteArrayList коллекция типа ArrayList с

алгоритмом CopyOnWrite;
CopyOnWriteArraySet реализация интерфейса Set, использующая за основу CopyOnWriteArrayList;
ConcurrentNavigableMap расширяет интерфейс NavigableMap;
ConcurrentSkipListMap аналог коллекции TreeMap с сортировкой данных по ключу и с поддержкой многопоточности;
ConcurrentSkipListSet реализация интерфейса Set, выполненная на основе класса ConcurrentSkipListMap.
Слайд 13

www.andersenlab.com Пакет Concurrent https://java-online.ru/concurrent-queue-noblock.xhtml https://java-online.ru/concurrent-queue-block.xhtml Неблокирующие очереди ConcurrentLinkedQueue ConcurrentLinkedDeque Блокирующие очереди

www.andersenlab.com

Пакет Concurrent

https://java-online.ru/concurrent-queue-noblock.xhtml
https://java-online.ru/concurrent-queue-block.xhtml

Неблокирующие очереди
ConcurrentLinkedQueue
ConcurrentLinkedDeque
Блокирующие очереди
ArrayBlockingQueue
LinkedBlockingQueue
LinkedBlockingDeque
SynchronousQueue
LinkedTransferQueue
DelayQueue
PriorityBlockingQueue

Слайд 14

www.andersenlab.com Пакет Concurrent https://java-online.ru/concurrent-atomic.xhtml AtomicBoolean AtomicInteger AtomicLong AtomicReference

www.andersenlab.com

Пакет Concurrent

https://java-online.ru/concurrent-atomic.xhtml

AtomicBoolean
AtomicInteger
AtomicLong
AtomicReference

Слайд 15

www.andersenlab.com Пакет Concurrent https://java-online.ru/concurrent-atomic.xhtml ReentrantLock ReentrantReadWriteLock StampedLock

www.andersenlab.com

Пакет Concurrent

https://java-online.ru/concurrent-atomic.xhtml

ReentrantLock
ReentrantReadWriteLock
StampedLock

Слайд 16

www.andersenlab.com Пакет Concurrent https://java-online.ru/concurrent-atomic.xhtml

www.andersenlab.com

Пакет Concurrent

https://java-online.ru/concurrent-atomic.xhtml

Слайд 17

www.andersenlab.com Пакет Concurrent https://java-online.ru/concurrent-atomic.xhtml Semaphore объект синхронизации, ограничивающий количество потоков, которые

www.andersenlab.com

Пакет Concurrent

https://java-online.ru/concurrent-atomic.xhtml

Semaphore объект синхронизации, ограничивающий количество потоков, которые могут «войти» в

заданный участок кода;
CountDownLatch объект синхронизации, разрешающий вход в заданный участок кода при выполнении определенных условий;
CyclicBarrier объект синхронизации типа «барьер», блокирующий выполнение определенного кода для заданного количества потоков;
Exchanger объект синхронизации, позволяющий провести обмен данными между двумя потоками;
Phaser объект синхронизации типа «барьер», но в отличие от CyclicBarrier, предоставляет больше гибкости.