Java threads - part 2

21
Накрайников Олег [email protected] Java Threads. Part 2 Java. The well-known and not well-known Java memory model (JMM) , Atomics, Concurrent collections

Transcript of Java threads - part 2

Page 1: Java threads - part 2

Накрайников Олег[email protected]

Java Threads. Part 2

Java. The well-known and not well-known

Java memory model (JMM) , Atomics, Concurrent collections

Page 2: Java threads - part 2

Пролог

Page 3: Java threads - part 2

Пакет java.util.concurrent.*

Executors

AtomicsLocks Synchronizers

QueuesConcurrent collections

Page 4: Java threads - part 2

О чем поговорим сегодня

▪ Java memory model (JMM) ▪ Atomics▪ Concurrent collections

Page 5: Java threads - part 2

Предпосылки модели памяти

Поток 1 Поток 2

x = 1; int r1 = y;

y = 2; int r2 = x;

Ожидание: если поток 2 считал y==2, то x==1, то есть r1=2, r2=1

Реальность: r1=2, r2=0.

Page 6: Java threads - part 2

Предпосылки модели памяти1) Выделит память под новый объект2) Вызовет конструктор класса Data3) Запишет значение 42 в поле answer класса Data4) Запишет строку в поле question класса Data5) Запишет значение 9000 в поле maxAllowedValue класса Data6) Запишет только что созданный объект в поле data класса Main

Page 7: Java threads - part 2

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

▪ Однопоточные программы исполняются псевдопоследовательно▪ Нет невесть откуда взявшихся значений: либо

значение по умолчанию либо присвоеное▪ Остальные события выполняются по порядку

если связаны отношением строгого частичного порядка «выполняется прежде» (англ. happens before)

Page 8: Java threads - part 2

Happens beforeВторая команда будет «в курсе» изменений, проведённых первой

Page 9: Java threads - part 2

Когерентность кешей, sharing, volatile

Page 10: Java threads - part 2

Когерентность кешей, sharing, volatile

Thread A: sharedObject.nonVolatile = 123;sharedObject.counter = sharedObject.counter + 1;

Thread B: int counter = sharedObject.counter; int nonVolatile = sharedObject.nonVolatile;

Page 11: Java threads - part 2

Atomics

Вывод: 30000Вывод: не детерминирован, но < 30000

Page 12: Java threads - part 2

Пакет java.util.concurrent.atomic.*

AtomicBoolean - Creating an AtomicBoolean- Getting the AtomicBoolean's Value- Setting the AtomicBoolean's Value- Swapping the AtomicBoolean's Value- Compare and Set AtomicBoolean's Value

AtomicInteger, AtomicLong - Creating an AtomicInteger/AtomicLong- Getting the AtomicInteger Valuec- Setting the AtomicInteger Value/AtomicLong- Compare and Set the AtomicInteger Value/AtomicLong- Adding to the AtomicInteger Value/AtomicLong- Subtracting From the AtomicInteger Value/AtomicLong

AtomicReference - Creating an AtomicReference- Getting the AtomicReference Reference- Setting the AtomicReference Reference- Comparing and Setting the AtomicReference Reference

Page 13: Java threads - part 2

Пакет java.util.concurrent.atomic.*

AtomicIntegerArray, AtomicILongArray

- Creating an AtomicIntegerArray, AtomicILongArray- get()- set()- compareAndSet()- addAndGet()- getAndAdd()- incrementAndGet()- getAndIncrement()- decrementAndGet()- getAndDecrement()- Additional Methods

AtomicReferenceArray - Creating an AtomicReferenceArray- get()- set()- compareAndSet()- Additional Methods

Page 14: Java threads - part 2

Пакет java.util.concurrent.atomic.*

LongAdder, DoubleAdder - add(long x)- decrement()- increment()- sum()- reset()

LongAccumulator, DoubleAccumulator

- LongAccumulator(LongBinaryOperator accumulator, long identity)- accumulate(long x)- get()- reset()

Page 15: Java threads - part 2

Пакет java.util.concurrent.atomic.*

LongAdder, DoubleAdder - add(long x)- decrement()- increment()- sum()- reset()

LongAccumulator, DoubleAccumulator

- LongAccumulator(LongBinaryOperator accumulator, long identity)- accumulate(long x)- get()- reset()

Page 16: Java threads - part 2

Базовые Concurrent Collections

- Hashtable()- Collections.synchronizedList()- Collections.synchronizedSet()- Collections.synchronizedMap()

Page 17: Java threads - part 2

Базовые Concurrent Collections

- Hashtable()- Collections.synchronizedList()- Collections.synchronizedSet()- Collections.synchronizedMap()

Page 18: Java threads - part 2

Lockfree Concurrent Collections

- CopyOnWriteArrayList<E>- CopyOnWriteArraySet<E>- ConcurrentHashMap<K, V>- ConcurrentSkipListMap<K, V>- ConcurrentSkipListSet<E>

Page 19: Java threads - part 2

Blocking Queues

- ArrayBlockingQueue<E>- LinkedBlockingQueue<E>- PriorityBlockingQueue<E>- DelayQueue<E extends Delayed>- SynchronousQueue<E> - LinkedTransferQueue<E>

Page 20: Java threads - part 2

Использованные источники

▪ Википедия - Модель памяти Java [https://ru.wikipedia.org/wiki/%D0%9C%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8_Java]

▪ Habrahabr - Модель памяти в примерах и не только [http://habrahabr.ru/post/133981/]

▪ jenkov.com - Java Concurrency / Multithreading Tutorial [http://tutorials.jenkov.com/java-concurrency/index.html]

▪ Habrahabr - Обзор java.util.concurrent.* [http://habrahabr.ru/company/luxoft/blog/157273/]

Page 21: Java threads - part 2

Спасибо за внимание!