SlideShare uma empresa Scribd logo
1 de 50
Multithreading in Java
past & actual.
April 20, 2016
2CONFIDENTIAL
• Полуков Євген, Software
Engineer у EPAM –
разработчик с более 6
годами опыта в ИТ из них
более 2 лет в EPAM. На
данный момент занимаюсь
разработкой e-commerce
(Hybris).
Обо Мне
3CONFIDENTIAL
Введение
Организация данных и задач1
Параллелизация за кулисами2
Загрузка процессоров полезной работой3
Хорошие алгоритмы4
Не надо изобретать велосипед5
4CONFIDENTIAL
О чем будем говорить?
MM and HMA1
Executors2
Atomics and Accumulators3
Locks4
Synchronizers5
5CONFIDENTIAL
История: Java Concurrency TimeLine
6CONFIDENTIAL
Thread : MM
• Каждий поток имет
свой thread stack.
• Вся информация о
методах и их вызовах
сохраняется в thread
stack.
• Все локальные
примитивы
сохраняются thread
stack.
7CONFIDENTIAL
Thread: MM and HMA
8CONFIDENTIAL
Thread: MM and HMA какие есть проблемы?
•Visibility of Shared Objects
•Race Conditions
9CONFIDENTIAL
Thread: Visibility of Shared Objects
• Если у нас возникает
работа с общими
объектами без
использования volatile
или synchronization.
• В данном случае нам
помогает volatile
решить данную
проблему.
10CONFIDENTIAL
Thread: Race Conditions
• Гонка потоков при
неатомарных
операциях. Если у нас
возникает работа с
общими объектами без
использование
synchronization.
• В данном случае нам
помогает
synchronization решить
данную проблему.
11CONFIDENTIAL
Thread State
12CONFIDENTIAL
Executors
•Возможность выбирать реализацию создания
потоков. (newCachedThreadPool,
newSingleThreadExecutor, newFixedThreadPool,
newSingleThreadScheduledExecutor)
•Удобное название потоков (по умолчанию pool-
N-thread-N или кастомный ThreadFactory)
•Запускать batch (Runnable, Callable)
•Остановка потоков (shutdown, shutdownNow)
13CONFIDENTIAL
Executors: ScheduledExecutorService
•Запуск потоков по расписанию
– schedule(Runnable command, long delay,
TimeUnit unit)
– scheduleAtFixedRate(Runnable command,
long initialDelay, long period, TimeUnit unit)
14CONFIDENTIAL
Executors: ScheduledExecutorService
service = Executors.newSingleThreadScheduledExecutor();
• если требуется отложить выполнение на 5 секунд
service.schedule(()-> { ... }, 5, TimeUnit.SECONDS);
• Если требуется назначить выполнение каждую секунду:
service.scheduleAtFixedRate(() -> { ... }, 0, 1, TimeUnit.SECONDS);
• Eсли требуется назначить выполнение кода с промежутком 1
секунда между выполнениями:
service.scheduleWithFixedDelay(()-> { ... }, 0, 1, TimeUnit.SECONDS);
15CONFIDENTIAL
Accumulators
• Инкрементируем счетчик в
разных потоках.
• Узнать статистику - сколько
потоков имеют доступ к
общему методу.
public void run() {
...
counter.incrementAndGet();
}
public long getCount() {
return counter.get();
}
Что использовать для counter?
16CONFIDENTIAL
Accumulators
17CONFIDENTIAL
Accumulators: LongAdder
• Защита от коллизий за счет структуры и
алгоритма
• @sun.misc.Contended class Cell
• cells: PaddedAtomicLong[availableProcessors()]
• hash: Thread.threadLocalHandonProbe
• Простой API
18CONFIDENTIAL
Accumulators: LongAdder
final LongAdder counter = new LongAdder();
public void run() {
...
counter.increment();
}
public long getCount() {
return counter.sum();
}
19CONFIDENTIAL
Accumulators: LongAdder: Подводные камни
• get(), reset(), sum() под нагрузкой просаживают
производительность из
- за обхода всех ячеек.
20CONFIDENTIAL
Accumulators: Atomic Update
• /**
* Atomically adds the given value to the current value.
*
* @param delta the value to add
* @return the previous value
*/
public final int getAndAdd(int delta) {
for (;;) {
int current = get();
int next = current + delta;
if (compareAndSet(current, next))
return current;
}
}
21CONFIDENTIAL
Accumulators
22CONFIDENTIAL
Accumulators: LongAccumulator
final LongAccumulator counter = new LongAccumulator(
(left, right) -> left * right, 2l
);
//LongBinaryOperator
//final LongAccumulator counter = new LongAccumulator(
Long::sum, 0l
);
//final AtomicLong counter = new AtomicLong(0);
public void run() {
counter.accumulate(1);
//counter.updateAndGet(counter->counter+1);
}
public long getCount() {
return counter.get();
}
23CONFIDENTIAL
Locks
•Блокировка на чтение, на запись
•Чтение без блокировки
•Конвертация (RW <->WR)
•Простота использования
•И чтобы быстро работало
Чего бы хотелось
24CONFIDENTIAL
Locks: ReentrantReadWriteLock
• Lock, блокировка на чтение, на запись
• Рекурсивный захват
• Пробная блокировка, таймауты
прерываемость
• Условия
• Честная/Нечестная
25CONFIDENTIAL
Locks: ReentrantReadWriteLock
• AbstractQueuedSynchronizer
– Атомарное состояние: volatile int state
– Очередь ожидания с атомарными
обновлениями
• ThreadLocal<HoldCounter>
• Инкапсуляция полная
Что внутри
26CONFIDENTIAL
Locks
27CONFIDENTIAL
Locks: StampedLock
• Lock, блокировка на чтение, на запись
• Оптимистическое чтение
• Конвертация (RW <->WR)
28CONFIDENTIAL
Locks: StampedLock
class Point {
private double x, y;
private final StampedLock sl = new StampedLock();
29CONFIDENTIAL
Locks: StampedLock
void move(double deltaX, double deltaY) { // an exclusively locked
method
long stamp = sl.writeLock();
try {
x += deltaX;
y += deltaY;
} finally {
sl.unlockWrite(stamp);
}
}
30CONFIDENTIAL
Locks: StampedLock
double distanceFromOrigin() { // A read-only method
long stamp = sl.readLock();
try {
return Math.hypot(x, y);
} finally {
sl.unlockRead(stamp);
}
}
31CONFIDENTIAL
Locks: StampedLock
double distanceFromOrigin() { // A read-only method
long stamp = sl.tryOptimisticRead();
double currentX = x, currentY = y;
if (!sl.validate(stamp)) {
stamp = sl.readLock();
try {
currentX = x; currentY = y;
} finally {
sl.unlockRead(stamp);
}
}
return Math.sqrt(currentX * currentX + currentY * currentY);
}
32CONFIDENTIAL
Locks: StampedLock
void moveIfAtOrigin(double newX, double newY) {
long stamp = sl.writeLock();
try {
if (x == 0.0 && y == 0.0) {
x = newX;
y = newY;
}
} finally {
sl.unlockWrite(stamp);
}
}
33CONFIDENTIAL
Locks: StampedLock
long stamp = sl.readLock(); // Could instead start with optimistic, not read
mode
try {
while (x == 0.0 && y == 0.0) {
long ws = sl.tryConvertToWriteLock(stamp);
if (ws != 0L) {
stamp = ws; x = newX; y = newY;
break;
} else {
sl.unlockRead(stamp);
stamp = sl.writeLock();
}
}
} finally {
sl.unlock(stamp);
34CONFIDENTIAL
Locks: StampedLock
• Оптимистическое чтение
• Если проверки неудачные, можно
захватить блокировку
• Конвертация (RW <->WR)
• native U.loadFance(), U.getLongVolatail();
35CONFIDENTIAL
Synchronizers
• CountDownLatch
• CyclicBarrier
• Semaphore
• Exchanger
36CONFIDENTIAL
Synchronizers : CountDownLatch
• Позволяет одному или нескольким
потокам ожидать до тех пор, пока не
завершится определенное количество
операций, выполняющих в других
потоках.
• Может использоваться раз.
37CONFIDENTIAL
Synchronizers : CountDownLatch
• CountDownLatch(int count)
• void await()
• boolean await(long timeout, TimeUnit unit)
• void countDown()
38CONFIDENTIAL
Synchronizers : CountDownLatch
class Service implements Runnable {
private static final int EMULATE_TIME_TO_START = 1000;
private final String name;
private final CountDownLatch latch;
public void run() {
...
sleep(EMULATE_TIME_TO_START);
Logger.getLogger(Service.class.getName()).log(
Level.INFO, name + " is Up");
latch.countDown(); //reduce count of CountDownLatch by 1
}
}
39CONFIDENTIAL
Synchronizers : CountDownLatch
public static void main(String args[]) throws InterruptedException {
final CountDownLatch latch = new CountDownLatch(3);
final ExecutorService executorService = Executors.newCachedThreadPool();
executorService.submit(new Service(CACHE, latch));
executorService.submit(new Service(ALERT, latch));
executorService.submit(new Service(GSM, latch));
latch.await(); //main thread is waiting on CountDownLatch to finish
Logger.getLogger(Service.class.getName()).log(Level.INFO,
"All services are up, Application is starting now");
}
40CONFIDENTIAL
Synchronizers : CyclicBarrier
• Очень похож на CountDownLatch но при достижение
барьера его можно переиспользовать опять.
• Возможность выполнить дополнительную логику до
достижения барьера.
41CONFIDENTIAL
Synchronizers : CyclicBarrier
• CyclicBarrier(int parties)
• CyclicBarrier(int parties, Runnable barrierAction)
• int await()
• int await(long timeout, TimeUnit unit)
• void reset()
42CONFIDENTIAL
Synchronizers : Exchanger
• Как видно из названия, основное предназначение
данного класса — это обмен объектами между двумя
потоками.
• При этом, также поддерживаются null значения, что
позволяет использовать данный класс для передачи
только одного объекта или же просто как синхронизатор
двух потоков.
• Первый поток, который вызывает метод exchange(...)
заблокируется до тех пор, пока тот же метод не вызовет
второй поток.
43CONFIDENTIAL
Synchronizers : Exchanger
class SimpleChat implements Runnable {
public SimpleChat(Exchanger<String> exchanger, String message) {
this.exchanger = exchanger;
this.message = message;
}
public void run() {
try {
Logger.getLogger(Service.class.getName()).log(Level.INFO,
getName() + " message: " + message);
message = exchanger.exchange(message); // exchange messages
} catch (Exception exe) {
Logger.getLogger(Service.class.getName()).log(Level.SEVERE, exe);
}
}
}
44CONFIDENTIAL
Synchronizers : Exchanger
public static void main(String[] args) {
final Exchanger<String> exchanger = new Exchanger<>();
final ExecutorService executorService = Executors.newCachedThreadPool();
executorService.submit(new SimpleChat(
exchanger, "Неплохо бы завтра в зал. Ну что идем?")
);
executorService.submit(new SimpleChat(
exchanger, "Да настало время жать!!!")
);
executorService.shutdown();
}
45CONFIDENTIAL
Synchronizers : Semaphore
• Используются для ограничения количества потоков при
работе с аппаратными ресурсами или файловой
системой. Доступ к общему ресурсу управляется с
помощью счетчика (permits).
46CONFIDENTIAL
Synchronizers : Semaphore
• Semaphore(int permits)
• void acquire();
• void acquire(int permits)
• boolean tryAcquire();
• boolean tryAcquire(long timeout, TimeUnit unit)
• void release();
• void release(int permits)
• protected void reducePermits(int reduction)
47CONFIDENTIAL
Synchronizers : Резюме
• CountDownLatch
- Делает одноразовую защелку, которую нельзя
обнулить
• CyclicBarrier
- Барьер, который сбрасывается, когда он достигнет
нуля, можна переиспользовать, плюс выполнять
логику, когда барьер достигнут.
• Exchanger
- Предзназначен для обмена объектами между двумя
потоками
48CONFIDENTIAL
Synchronizers : Резюме
• Semaphore
- Предназначен для ограничение количества роботы
потоков в системе. Узким местом при использовании
семафоров является заданное количества разрешений,
т.к. зачастую это число приходится подбирать в
зависимости от мощности «железа».
49CONFIDENTIAL
Конец 
50CONFIDENTIAL
Полезные ссылки и книжки
• Java Concurrency in Practice 1st Edition
• https://habrahabr.ru/company/luxoft/blog/157273/
• Effective Java (2nd Edition) 2nd Edition
• The Art of Multiprocessor Programming, Revised Reprint 1st Edition
• http://altair.cs.oswego.edu/mailman/listinfo/concurrency-interest
• http://openjdk.java.net/jeps/188
• http://psy-lob-saw.blogspot.com/

Mais conteúdo relacionado

Mais procurados

Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev FedorProgramming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev FedorFedor Lavrentyev
 
Распределенные системы в Одноклассниках
Распределенные системы в ОдноклассникахРаспределенные системы в Одноклассниках
Распределенные системы в Одноклассникахodnoklassniki.ru
 
Помоги ближнему, или Как потоки помогают друг другу
Помоги ближнему, или Как потоки помогают друг другуПомоги ближнему, или Как потоки помогают друг другу
Помоги ближнему, или Как потоки помогают друг другуCEE-SEC(R)
 
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Noveo
 
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: PromisesRAMBLER&Co
 
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))Noveo
 
Незаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервераНезаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервераodnoklassniki.ru
 
Практика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверПрактика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверPlatonov Sergey
 
Выжимаем из сервера максимум (Андрей Паньгин)
Выжимаем из сервера максимум (Андрей Паньгин)Выжимаем из сервера максимум (Андрей Паньгин)
Выжимаем из сервера максимум (Андрей Паньгин)Ontico
 
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)Ontico
 
Как сделать ваш JavaScript быстрее
Как сделать ваш JavaScript быстрееКак сделать ваш JavaScript быстрее
Как сделать ваш JavaScript быстрееRoman Dvornov
 
Android - 11 - Multithreading
Android - 11 - MultithreadingAndroid - 11 - Multithreading
Android - 11 - MultithreadingNoveo
 
Java осень 2014 занятие 8
Java осень 2014 занятие 8Java осень 2014 занятие 8
Java осень 2014 занятие 8Technopark
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2Eugeniy Tyumentcev
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухинcorehard_by
 
RDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRAMBLER&Co
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3Eugeniy Tyumentcev
 
JavaScript. Event Loop and Timers (in russian)
JavaScript. Event Loop and Timers (in russian)JavaScript. Event Loop and Timers (in russian)
JavaScript. Event Loop and Timers (in russian)Mikhail Davydov
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerAnton Arhipov
 

Mais procurados (20)

Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev FedorProgramming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
 
Распределенные системы в Одноклассниках
Распределенные системы в ОдноклассникахРаспределенные системы в Одноклассниках
Распределенные системы в Одноклассниках
 
Thread
ThreadThread
Thread
 
Помоги ближнему, или Как потоки помогают друг другу
Помоги ближнему, или Как потоки помогают друг другуПомоги ближнему, или Как потоки помогают друг другу
Помоги ближнему, или Как потоки помогают друг другу
 
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
 
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: Promises
 
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
 
Незаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервераНезаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервера
 
Практика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверПрактика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-сервер
 
Выжимаем из сервера максимум (Андрей Паньгин)
Выжимаем из сервера максимум (Андрей Паньгин)Выжимаем из сервера максимум (Андрей Паньгин)
Выжимаем из сервера максимум (Андрей Паньгин)
 
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
 
Как сделать ваш JavaScript быстрее
Как сделать ваш JavaScript быстрееКак сделать ваш JavaScript быстрее
Как сделать ваш JavaScript быстрее
 
Android - 11 - Multithreading
Android - 11 - MultithreadingAndroid - 11 - Multithreading
Android - 11 - Multithreading
 
Java осень 2014 занятие 8
Java осень 2014 занятие 8Java осень 2014 занятие 8
Java осень 2014 занятие 8
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
 
RDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на Swift
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
JavaScript. Event Loop and Timers (in russian)
JavaScript. Event Loop and Timers (in russian)JavaScript. Event Loop and Timers (in russian)
JavaScript. Event Loop and Timers (in russian)
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profiler
 

Destaque

CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!
CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!
CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!CodeFest
 
Understanding Date Handling and Collection Framework
Understanding Date Handling and Collection FrameworkUnderstanding Date Handling and Collection Framework
Understanding Date Handling and Collection Frameworkashishspace
 
Expert Java Day: Java concurrency
Expert Java Day: Java concurrencyExpert Java Day: Java concurrency
Expert Java Day: Java concurrencyPavel Titkov
 
Загрузчики классов в Java - коллекция граблей
Загрузчики классов в Java - коллекция граблейЗагрузчики классов в Java - коллекция граблей
Загрузчики классов в Java - коллекция граблейAnton Arhipov
 
Usage concurrence in java
Usage concurrence in javaUsage concurrence in java
Usage concurrence in javaAsya Dudnik
 
Основы Java. 4. Collection Framework
Основы Java. 4. Collection FrameworkОсновы Java. 4. Collection Framework
Основы Java. 4. Collection FrameworkSergey Nemchinsky
 
Основы Java. 3. Конструкторы, уровни доступа, статика
Основы Java. 3. Конструкторы, уровни доступа, статикаОсновы Java. 3. Конструкторы, уровни доступа, статика
Основы Java. 3. Конструкторы, уровни доступа, статикаSergey Nemchinsky
 
Comparing different concurrency models on the JVM
Comparing different concurrency models on the JVMComparing different concurrency models on the JVM
Comparing different concurrency models on the JVMMario Fusco
 
Ratpack Web Framework
Ratpack Web FrameworkRatpack Web Framework
Ratpack Web FrameworkDaniel Woods
 
Akka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный кодAkka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный кодRoman Grebennikov
 
Thread presentation
Thread presentationThread presentation
Thread presentationAAshish Ojha
 
High Performance Microservices with Ratpack and Spring Boot
High Performance Microservices with Ratpack and Spring BootHigh Performance Microservices with Ratpack and Spring Boot
High Performance Microservices with Ratpack and Spring BootDaniel Woods
 
MOM - Message Oriented Middleware
MOM - Message Oriented MiddlewareMOM - Message Oriented Middleware
MOM - Message Oriented MiddlewarePeter R. Egli
 
Visual Design with Data
Visual Design with DataVisual Design with Data
Visual Design with DataSeth Familian
 

Destaque (16)

CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!
CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!
CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!
 
Understanding Date Handling and Collection Framework
Understanding Date Handling and Collection FrameworkUnderstanding Date Handling and Collection Framework
Understanding Date Handling and Collection Framework
 
Expert Java Day: Java concurrency
Expert Java Day: Java concurrencyExpert Java Day: Java concurrency
Expert Java Day: Java concurrency
 
Загрузчики классов в Java - коллекция граблей
Загрузчики классов в Java - коллекция граблейЗагрузчики классов в Java - коллекция граблей
Загрузчики классов в Java - коллекция граблей
 
Usage concurrence in java
Usage concurrence in javaUsage concurrence in java
Usage concurrence in java
 
Основы Java. 4. Collection Framework
Основы Java. 4. Collection FrameworkОсновы Java. 4. Collection Framework
Основы Java. 4. Collection Framework
 
Основы Java. 3. Конструкторы, уровни доступа, статика
Основы Java. 3. Конструкторы, уровни доступа, статикаОсновы Java. 3. Конструкторы, уровни доступа, статика
Основы Java. 3. Конструкторы, уровни доступа, статика
 
Comparing different concurrency models on the JVM
Comparing different concurrency models on the JVMComparing different concurrency models on the JVM
Comparing different concurrency models on the JVM
 
Ratpack Web Framework
Ratpack Web FrameworkRatpack Web Framework
Ratpack Web Framework
 
Akka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный кодAkka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный код
 
Thread presentation
Thread presentationThread presentation
Thread presentation
 
Threads
ThreadsThreads
Threads
 
High Performance Microservices with Ratpack and Spring Boot
High Performance Microservices with Ratpack and Spring BootHigh Performance Microservices with Ratpack and Spring Boot
High Performance Microservices with Ratpack and Spring Boot
 
MOM - Message Oriented Middleware
MOM - Message Oriented MiddlewareMOM - Message Oriented Middleware
MOM - Message Oriented Middleware
 
SlideShare 101
SlideShare 101SlideShare 101
SlideShare 101
 
Visual Design with Data
Visual Design with DataVisual Design with Data
Visual Design with Data
 

Semelhante a Multithreading in java past and actual

Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийAndrey Akinshin
 
NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript Dmytro Mindra
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2etyumentcev
 
Ciklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptCiklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptDmytro Mindra
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMTech Talks @NSU
 
Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6Technopark
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один goBadoo Development
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularizationIvan Krylov
 
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...Andrey Karpov
 
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)Ontico
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
 
Asynchrony and coroutines
Asynchrony and coroutinesAsynchrony and coroutines
Asynchrony and coroutinescorehard_by
 
Поговорим о микрооптимизациях .NET-приложений
Поговорим о микрооптимизациях .NET-приложенийПоговорим о микрооптимизациях .NET-приложений
Поговорим о микрооптимизациях .NET-приложенийAndrey Akinshin
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияSergey Platonov
 
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...Ontico
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioAndrey Karpov
 
Java осень 2013 лекция 6
Java осень 2013 лекция 6Java осень 2013 лекция 6
Java осень 2013 лекция 6Technopark
 
Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...
Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...
Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...Alexander Borzunov
 
Борзунов Александр, Cpmoptimize
Борзунов Александр, CpmoptimizeБорзунов Александр, Cpmoptimize
Борзунов Александр, CpmoptimizeDarya Zubova
 

Semelhante a Multithreading in java past and actual (20)

Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложений
 
NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
 
Ciklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptCiklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScript
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
 
Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один go
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularization
 
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
 
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Asynchrony and coroutines
Asynchrony and coroutinesAsynchrony and coroutines
Asynchrony and coroutines
 
Поговорим о микрооптимизациях .NET-приложений
Поговорим о микрооптимизациях .NET-приложенийПоговорим о микрооптимизациях .NET-приложений
Поговорим о микрооптимизациях .NET-приложений
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизация
 
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Java осень 2013 лекция 6
Java осень 2013 лекция 6Java осень 2013 лекция 6
Java осень 2013 лекция 6
 
Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...
Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...
Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...
 
Борзунов Александр, Cpmoptimize
Борзунов Александр, CpmoptimizeБорзунов Александр, Cpmoptimize
Борзунов Александр, Cpmoptimize
 

Multithreading in java past and actual

  • 1. Multithreading in Java past & actual. April 20, 2016
  • 2. 2CONFIDENTIAL • Полуков Євген, Software Engineer у EPAM – разработчик с более 6 годами опыта в ИТ из них более 2 лет в EPAM. На данный момент занимаюсь разработкой e-commerce (Hybris). Обо Мне
  • 3. 3CONFIDENTIAL Введение Организация данных и задач1 Параллелизация за кулисами2 Загрузка процессоров полезной работой3 Хорошие алгоритмы4 Не надо изобретать велосипед5
  • 4. 4CONFIDENTIAL О чем будем говорить? MM and HMA1 Executors2 Atomics and Accumulators3 Locks4 Synchronizers5
  • 6. 6CONFIDENTIAL Thread : MM • Каждий поток имет свой thread stack. • Вся информация о методах и их вызовах сохраняется в thread stack. • Все локальные примитивы сохраняются thread stack.
  • 8. 8CONFIDENTIAL Thread: MM and HMA какие есть проблемы? •Visibility of Shared Objects •Race Conditions
  • 9. 9CONFIDENTIAL Thread: Visibility of Shared Objects • Если у нас возникает работа с общими объектами без использования volatile или synchronization. • В данном случае нам помогает volatile решить данную проблему.
  • 10. 10CONFIDENTIAL Thread: Race Conditions • Гонка потоков при неатомарных операциях. Если у нас возникает работа с общими объектами без использование synchronization. • В данном случае нам помогает synchronization решить данную проблему.
  • 12. 12CONFIDENTIAL Executors •Возможность выбирать реализацию создания потоков. (newCachedThreadPool, newSingleThreadExecutor, newFixedThreadPool, newSingleThreadScheduledExecutor) •Удобное название потоков (по умолчанию pool- N-thread-N или кастомный ThreadFactory) •Запускать batch (Runnable, Callable) •Остановка потоков (shutdown, shutdownNow)
  • 13. 13CONFIDENTIAL Executors: ScheduledExecutorService •Запуск потоков по расписанию – schedule(Runnable command, long delay, TimeUnit unit) – scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
  • 14. 14CONFIDENTIAL Executors: ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); • если требуется отложить выполнение на 5 секунд service.schedule(()-> { ... }, 5, TimeUnit.SECONDS); • Если требуется назначить выполнение каждую секунду: service.scheduleAtFixedRate(() -> { ... }, 0, 1, TimeUnit.SECONDS); • Eсли требуется назначить выполнение кода с промежутком 1 секунда между выполнениями: service.scheduleWithFixedDelay(()-> { ... }, 0, 1, TimeUnit.SECONDS);
  • 15. 15CONFIDENTIAL Accumulators • Инкрементируем счетчик в разных потоках. • Узнать статистику - сколько потоков имеют доступ к общему методу. public void run() { ... counter.incrementAndGet(); } public long getCount() { return counter.get(); } Что использовать для counter?
  • 17. 17CONFIDENTIAL Accumulators: LongAdder • Защита от коллизий за счет структуры и алгоритма • @sun.misc.Contended class Cell • cells: PaddedAtomicLong[availableProcessors()] • hash: Thread.threadLocalHandonProbe • Простой API
  • 18. 18CONFIDENTIAL Accumulators: LongAdder final LongAdder counter = new LongAdder(); public void run() { ... counter.increment(); } public long getCount() { return counter.sum(); }
  • 19. 19CONFIDENTIAL Accumulators: LongAdder: Подводные камни • get(), reset(), sum() под нагрузкой просаживают производительность из - за обхода всех ячеек.
  • 20. 20CONFIDENTIAL Accumulators: Atomic Update • /** * Atomically adds the given value to the current value. * * @param delta the value to add * @return the previous value */ public final int getAndAdd(int delta) { for (;;) { int current = get(); int next = current + delta; if (compareAndSet(current, next)) return current; } }
  • 22. 22CONFIDENTIAL Accumulators: LongAccumulator final LongAccumulator counter = new LongAccumulator( (left, right) -> left * right, 2l ); //LongBinaryOperator //final LongAccumulator counter = new LongAccumulator( Long::sum, 0l ); //final AtomicLong counter = new AtomicLong(0); public void run() { counter.accumulate(1); //counter.updateAndGet(counter->counter+1); } public long getCount() { return counter.get(); }
  • 23. 23CONFIDENTIAL Locks •Блокировка на чтение, на запись •Чтение без блокировки •Конвертация (RW <->WR) •Простота использования •И чтобы быстро работало Чего бы хотелось
  • 24. 24CONFIDENTIAL Locks: ReentrantReadWriteLock • Lock, блокировка на чтение, на запись • Рекурсивный захват • Пробная блокировка, таймауты прерываемость • Условия • Честная/Нечестная
  • 25. 25CONFIDENTIAL Locks: ReentrantReadWriteLock • AbstractQueuedSynchronizer – Атомарное состояние: volatile int state – Очередь ожидания с атомарными обновлениями • ThreadLocal<HoldCounter> • Инкапсуляция полная Что внутри
  • 27. 27CONFIDENTIAL Locks: StampedLock • Lock, блокировка на чтение, на запись • Оптимистическое чтение • Конвертация (RW <->WR)
  • 28. 28CONFIDENTIAL Locks: StampedLock class Point { private double x, y; private final StampedLock sl = new StampedLock();
  • 29. 29CONFIDENTIAL Locks: StampedLock void move(double deltaX, double deltaY) { // an exclusively locked method long stamp = sl.writeLock(); try { x += deltaX; y += deltaY; } finally { sl.unlockWrite(stamp); } }
  • 30. 30CONFIDENTIAL Locks: StampedLock double distanceFromOrigin() { // A read-only method long stamp = sl.readLock(); try { return Math.hypot(x, y); } finally { sl.unlockRead(stamp); } }
  • 31. 31CONFIDENTIAL Locks: StampedLock double distanceFromOrigin() { // A read-only method long stamp = sl.tryOptimisticRead(); double currentX = x, currentY = y; if (!sl.validate(stamp)) { stamp = sl.readLock(); try { currentX = x; currentY = y; } finally { sl.unlockRead(stamp); } } return Math.sqrt(currentX * currentX + currentY * currentY); }
  • 32. 32CONFIDENTIAL Locks: StampedLock void moveIfAtOrigin(double newX, double newY) { long stamp = sl.writeLock(); try { if (x == 0.0 && y == 0.0) { x = newX; y = newY; } } finally { sl.unlockWrite(stamp); } }
  • 33. 33CONFIDENTIAL Locks: StampedLock long stamp = sl.readLock(); // Could instead start with optimistic, not read mode try { while (x == 0.0 && y == 0.0) { long ws = sl.tryConvertToWriteLock(stamp); if (ws != 0L) { stamp = ws; x = newX; y = newY; break; } else { sl.unlockRead(stamp); stamp = sl.writeLock(); } } } finally { sl.unlock(stamp);
  • 34. 34CONFIDENTIAL Locks: StampedLock • Оптимистическое чтение • Если проверки неудачные, можно захватить блокировку • Конвертация (RW <->WR) • native U.loadFance(), U.getLongVolatail();
  • 36. 36CONFIDENTIAL Synchronizers : CountDownLatch • Позволяет одному или нескольким потокам ожидать до тех пор, пока не завершится определенное количество операций, выполняющих в других потоках. • Может использоваться раз.
  • 37. 37CONFIDENTIAL Synchronizers : CountDownLatch • CountDownLatch(int count) • void await() • boolean await(long timeout, TimeUnit unit) • void countDown()
  • 38. 38CONFIDENTIAL Synchronizers : CountDownLatch class Service implements Runnable { private static final int EMULATE_TIME_TO_START = 1000; private final String name; private final CountDownLatch latch; public void run() { ... sleep(EMULATE_TIME_TO_START); Logger.getLogger(Service.class.getName()).log( Level.INFO, name + " is Up"); latch.countDown(); //reduce count of CountDownLatch by 1 } }
  • 39. 39CONFIDENTIAL Synchronizers : CountDownLatch public static void main(String args[]) throws InterruptedException { final CountDownLatch latch = new CountDownLatch(3); final ExecutorService executorService = Executors.newCachedThreadPool(); executorService.submit(new Service(CACHE, latch)); executorService.submit(new Service(ALERT, latch)); executorService.submit(new Service(GSM, latch)); latch.await(); //main thread is waiting on CountDownLatch to finish Logger.getLogger(Service.class.getName()).log(Level.INFO, "All services are up, Application is starting now"); }
  • 40. 40CONFIDENTIAL Synchronizers : CyclicBarrier • Очень похож на CountDownLatch но при достижение барьера его можно переиспользовать опять. • Возможность выполнить дополнительную логику до достижения барьера.
  • 41. 41CONFIDENTIAL Synchronizers : CyclicBarrier • CyclicBarrier(int parties) • CyclicBarrier(int parties, Runnable barrierAction) • int await() • int await(long timeout, TimeUnit unit) • void reset()
  • 42. 42CONFIDENTIAL Synchronizers : Exchanger • Как видно из названия, основное предназначение данного класса — это обмен объектами между двумя потоками. • При этом, также поддерживаются null значения, что позволяет использовать данный класс для передачи только одного объекта или же просто как синхронизатор двух потоков. • Первый поток, который вызывает метод exchange(...) заблокируется до тех пор, пока тот же метод не вызовет второй поток.
  • 43. 43CONFIDENTIAL Synchronizers : Exchanger class SimpleChat implements Runnable { public SimpleChat(Exchanger<String> exchanger, String message) { this.exchanger = exchanger; this.message = message; } public void run() { try { Logger.getLogger(Service.class.getName()).log(Level.INFO, getName() + " message: " + message); message = exchanger.exchange(message); // exchange messages } catch (Exception exe) { Logger.getLogger(Service.class.getName()).log(Level.SEVERE, exe); } } }
  • 44. 44CONFIDENTIAL Synchronizers : Exchanger public static void main(String[] args) { final Exchanger<String> exchanger = new Exchanger<>(); final ExecutorService executorService = Executors.newCachedThreadPool(); executorService.submit(new SimpleChat( exchanger, "Неплохо бы завтра в зал. Ну что идем?") ); executorService.submit(new SimpleChat( exchanger, "Да настало время жать!!!") ); executorService.shutdown(); }
  • 45. 45CONFIDENTIAL Synchronizers : Semaphore • Используются для ограничения количества потоков при работе с аппаратными ресурсами или файловой системой. Доступ к общему ресурсу управляется с помощью счетчика (permits).
  • 46. 46CONFIDENTIAL Synchronizers : Semaphore • Semaphore(int permits) • void acquire(); • void acquire(int permits) • boolean tryAcquire(); • boolean tryAcquire(long timeout, TimeUnit unit) • void release(); • void release(int permits) • protected void reducePermits(int reduction)
  • 47. 47CONFIDENTIAL Synchronizers : Резюме • CountDownLatch - Делает одноразовую защелку, которую нельзя обнулить • CyclicBarrier - Барьер, который сбрасывается, когда он достигнет нуля, можна переиспользовать, плюс выполнять логику, когда барьер достигнут. • Exchanger - Предзназначен для обмена объектами между двумя потоками
  • 48. 48CONFIDENTIAL Synchronizers : Резюме • Semaphore - Предназначен для ограничение количества роботы потоков в системе. Узким местом при использовании семафоров является заданное количества разрешений, т.к. зачастую это число приходится подбирать в зависимости от мощности «железа».
  • 50. 50CONFIDENTIAL Полезные ссылки и книжки • Java Concurrency in Practice 1st Edition • https://habrahabr.ru/company/luxoft/blog/157273/ • Effective Java (2nd Edition) 2nd Edition • The Art of Multiprocessor Programming, Revised Reprint 1st Edition • http://altair.cs.oswego.edu/mailman/listinfo/concurrency-interest • http://openjdk.java.net/jeps/188 • http://psy-lob-saw.blogspot.com/

Notas do Editor

  1. P37 – divide into 2 slides