SlideShare uma empresa Scribd logo
1 de 28
6. Многопоточность
Программирование на Java
Федор Лаврентьев
МФТИ, 2016
Потоки
Процесс и поток
• Процесс
• Выделенная память
• Процессорное время расходуется потоками
• Порождается через fork
• Общается с другими процессами через сокеты и shared memory
• Поток
• Общая память процесса
• Собственный кеш
• Расходует процессорное время
• Порождается внутри процесса
• Общается с другими потоками через общую память процесса
java.lang.Thread
• start(), run()
• static sleep(), static yield()
• stop(), destroy()
• interrupt(), isInterrupted(), static interrupted()
• setDaemon(), isDaemon()
• join()
• getState():
• NEW
• RUNNABLE
• BLOCKED
• WAITING, TIMED_WAITING
• TERMINATED
Старт потока через override
public void runOverridenThread() {
Thread thread = new Thread() {
@Override
public void run() {
// do something
}
};
thread.start();
}
Старт потока с Runnable
public void runRunnableInThread() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// do something
}
});
thread.start();
}
Прерывание потока
public void interruptThread() throws Exception {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (!Thread.interrupted()) {
// Do something useful
}
// Thread interrupted
}
});
thread.start();
Thread.sleep(1);
thread.interrupt();
}
Прерывание блокирующего вызова
public void interruptThread() throws Exception {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (!Thread.interrupted()) {
// Do something useful
try {
Thread.sleep(1000); // blocking call
} catch (InterruptedException e) {
// Thread interrupted
}
}
// Thread interrupted
}
});
thread.start(); Thread.sleep(1); thread.interrupt();
}
Работа с памятью
synchronized
• Критическая секция
• Допускается повторное вхождение (reentrant)
• Синхронизироваться можно по любому объекту
• Необходимо минимизировать размер критических секций
• По возможности, дробить критические секции на части
• Можно использовать альтернативные блокировки
synchronized
public static synchronized void sMethod() {
// тело метода
}
public static void sMethodDescribed () {
synchronized (SynchronizedExample.class) {
// тело метода
}
}
public synchronized void iMethod() {
// тело метода
}
public void iMethodDescribed() {
synchronized (this) {
// тело метода
}
}
private final Object lock = new Object();
public void anotherObject () {
synchronized (lock) {
// тело метода
}
}
volatile
• Форсирует работу с памятью в обход кешей
• Гарантирует атомарное чтение и запись для double и long
• Не гарантирует атомарный инкремент
private volatile long value;
Atomic*
• Базируются на операции compareAndSet(previous, next)
• Это отдельная инструкция байт-кода JVM
• Гарантирует атомарность чтения, записи и инкремента
• java.util.concurrent.atomic.*:
• AtomicInteger
• AtomicLong
• AtomicBoolean
• AtomicReference<T>
• AtomicIntegerArray
• AtomicLongArray
Atomic incrementAndGet()
public class AtomicInteger extends Number {
private volatile int value;
private native boolean compareAndSet(int current, int next);
public final int incrementAndGet () {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next)) {
return next;
}
}
}
}
Atomic getAndIncrement()
public class AtomicInteger extends Number {
private volatile int value;
private native boolean compareAndSet(int current, int next);
public final int getAndIncrement() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next)) {
return current;
}
}
}
}
Immutable
• Неизменяемые объекты не нуждаются в синхронизации
состояния, а значит, потокобезопасны
• Все поля – final (либо не изменяются)
• Все mutable параметры конструктора скопированы
• Ссылки на внутренние mutable объекты не публикуются
• Родительский класс также immutable
• Нет утечки ссылки на this из конструктора
Проблемы многопоточности
Deadlock
class Account {
public int money;
}
class AccountManager {
public void transfer(Account from, Account to, int amount) {
assert amount > 0;
synchronized (from) {
assert from.money >= amount;
synchronized (to) {
to.money += amount;
from.money -= amount;
}
}
}
}
Lock ordering
class Account {
public int money;
public final long id;
}
class AccountManager {
public void transfer(Account from, Account to, int amount) {
assert amount > 0;
assert from.number != to.number;
Object first = from.number < to.number ? from : to;
Object second = from.number < to.number ? to : from;
synchronized (first) {
synchronized (second) {
to.money += amount;
from.money -= amount;
}
}
}
}
Livelock
• Поток успешно получает блокировку, однако выполнить полезное
действие не может
• Два потока конфликтуют, откатывают результаты своей работы и
пытаются через фиксированное время повторить попытку
(например, делают sleep(1000)).
• При следующей попытке они опять будут конфликтовать
• Пример – задача про обедающих философов
• Решение – случайная задержка
Starvation
• Бесконечные циклы – холостая утилизация CPU
• sleep при взятой блокировке
• Blocking IO при взятой блокировке
• Неоптимальные приоритеты потоков в ОС
Решение проблем
• Не использовать многопоточность
• Не разделять состояние между потоками
• Разделять только immutable-состояние
• Использовать lock-free алгоритмы
• Использовать готовые примитивы синхронизации
• Аккуратнее программировать синхронизацию
Примитивы синхронизации
https://habrahabr.ru/company/luxoft/blog/157273/
Lock (ReentrantLock)
• lock()
• unlock()
• tryLock()
• tryLock(long timeout)
ReadWriteLock
• readLock().lock()
• readLock().unlock()
• writeLock().lock()
• writeLock().unlock()
http://www.java67.com/2012/08/5-thread-interview-questions-answers-in.html
CountDownLatch
• new CountDownLatch(int count)
• await()
• countDown()
http://www.topjavatutorial.com/java/countdownlatch-in-java/
А также
• Semaphore
• CyclicBarrier
• Exchanger
• Phaser
Concurrent-коллекции
• Vector, Stack, Hashtable
• Collections.synchronized*()
• ConcurrentHashMap, ConcurrentSkipListMap
• CopyOnWriteArrayList, CopyOnWriteArraySet
• BlockingQueue – ArrayBQ, LinkedBQ
• ConcurrentLinkedQueue

Mais conteúdo relacionado

Mais procurados

Date & Time in Java SE 8
Date & Time in Java SE 8Date & Time in Java SE 8
Date & Time in Java SE 8Ilya Lapitan
 
Java tricks for high-load server programming
Java tricks for high-load server programmingJava tricks for high-load server programming
Java tricks for high-load server programmingAndrei Pangin
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage CollectorOlexandra Dmytrenko
 
Developing highload servers with Java
Developing highload servers with JavaDeveloping highload servers with Java
Developing highload servers with JavaAndrei Pangin
 
Системы контроля версий
Системы контроля версийСистемы контроля версий
Системы контроля версийUnguryan Vitaliy
 
Web весна 2013 лекция 9
Web весна 2013 лекция 9Web весна 2013 лекция 9
Web весна 2013 лекция 9Technopark
 
Java. Сборщик мусора. Работа с памятью.
Java.  Сборщик мусора. Работа с памятью. Java.  Сборщик мусора. Работа с памятью.
Java. Сборщик мусора. Работа с памятью. Unguryan Vitaliy
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey TeplyakovAlex Tumanoff
 
Async clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAsync clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAlex Tumanoff
 
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Noveo
 
Распределенные системы в Одноклассниках
Распределенные системы в ОдноклассникахРаспределенные системы в Одноклассниках
Распределенные системы в Одноклассникахodnoklassniki.ru
 
Незаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервераНезаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервераodnoklassniki.ru
 
Svitla .Net meetup in Kiev, Anzhiiak Oleksii
Svitla .Net meetup in Kiev, Anzhiiak OleksiiSvitla .Net meetup in Kiev, Anzhiiak Oleksii
Svitla .Net meetup in Kiev, Anzhiiak OleksiiSvitla Systems Inc.
 
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: PromisesRAMBLER&Co
 
Выжимаем из сервера максимум (Андрей Паньгин)
Выжимаем из сервера максимум (Андрей Паньгин)Выжимаем из сервера максимум (Андрей Паньгин)
Выжимаем из сервера максимум (Андрей Паньгин)Ontico
 
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))Noveo
 

Mais procurados (20)

Date & Time in Java SE 8
Date & Time in Java SE 8Date & Time in Java SE 8
Date & Time in Java SE 8
 
Java tricks for high-load server programming
Java tricks for high-load server programmingJava tricks for high-load server programming
Java tricks for high-load server programming
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage Collector
 
Developing highload servers with Java
Developing highload servers with JavaDeveloping highload servers with Java
Developing highload servers with Java
 
Системы контроля версий
Системы контроля версийСистемы контроля версий
Системы контроля версий
 
Асинхронный JavaScript
Асинхронный JavaScriptАсинхронный JavaScript
Асинхронный JavaScript
 
Lec 14
Lec 14Lec 14
Lec 14
 
Web весна 2013 лекция 9
Web весна 2013 лекция 9Web весна 2013 лекция 9
Web весна 2013 лекция 9
 
Java. Сборщик мусора. Работа с памятью.
Java.  Сборщик мусора. Работа с памятью. Java.  Сборщик мусора. Работа с памятью.
Java. Сборщик мусора. Работа с памятью.
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
 
Async clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAsync clinic by by Sergey Teplyakov
Async clinic by by Sergey Teplyakov
 
Bytecode
BytecodeBytecode
Bytecode
 
Lab5
Lab5Lab5
Lab5
 
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
 
Распределенные системы в Одноклассниках
Распределенные системы в ОдноклассникахРаспределенные системы в Одноклассниках
Распределенные системы в Одноклассниках
 
Незаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервераНезаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервера
 
Svitla .Net meetup in Kiev, Anzhiiak Oleksii
Svitla .Net meetup in Kiev, Anzhiiak OleksiiSvitla .Net meetup in Kiev, Anzhiiak Oleksii
Svitla .Net meetup in Kiev, Anzhiiak Oleksii
 
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))
 

Destaque

Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Fedor Lavrentyev
 
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
Programming Java - Lecture 02 - Objects - Lavrentyev FedorProgramming Java - Lecture 02 - Objects - Lavrentyev Fedor
Programming Java - Lecture 02 - Objects - Lavrentyev FedorFedor Lavrentyev
 
Programming Java - Lection 03 - Classes - Lavrentyev Fedor
Programming Java - Lection 03 - Classes - Lavrentyev FedorProgramming Java - Lection 03 - Classes - Lavrentyev Fedor
Programming Java - Lection 03 - Classes - Lavrentyev FedorFedor Lavrentyev
 
Programming Java - Lection 05 - Software Design - Lavrentyev Fedor
Programming Java - Lection 05 - Software Design - Lavrentyev FedorProgramming Java - Lection 05 - Software Design - Lavrentyev Fedor
Programming Java - Lection 05 - Software Design - Lavrentyev FedorFedor Lavrentyev
 
Programming Java - Lection 01 - Basics - Lavrentyev Fedor
Programming Java - Lection 01 - Basics - Lavrentyev FedorProgramming Java - Lection 01 - Basics - Lavrentyev Fedor
Programming Java - Lection 01 - Basics - Lavrentyev FedorFedor Lavrentyev
 
Programming Java - Lection 07 - Puzzlers - Lavrentyev Fedor
Programming Java - Lection 07 - Puzzlers - Lavrentyev FedorProgramming Java - Lection 07 - Puzzlers - Lavrentyev Fedor
Programming Java - Lection 07 - Puzzlers - Lavrentyev FedorFedor Lavrentyev
 
Industrial Programming Java - Lection Pack 02 - Distributed applications - La...
Industrial Programming Java - Lection Pack 02 - Distributed applications - La...Industrial Programming Java - Lection Pack 02 - Distributed applications - La...
Industrial Programming Java - Lection Pack 02 - Distributed applications - La...Fedor Lavrentyev
 
Programming Java - Lection 04 - Generics and Lambdas - Lavrentyev Fedor
Programming Java - Lection 04 - Generics and Lambdas - Lavrentyev FedorProgramming Java - Lection 04 - Generics and Lambdas - Lavrentyev Fedor
Programming Java - Lection 04 - Generics and Lambdas - Lavrentyev FedorFedor Lavrentyev
 
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...Fedor Lavrentyev
 
Semantic web: An overview
Semantic web: An overviewSemantic web: An overview
Semantic web: An overviewAndré Mazayev
 

Destaque (13)

Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
 
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
Programming Java - Lecture 02 - Objects - Lavrentyev FedorProgramming Java - Lecture 02 - Objects - Lavrentyev Fedor
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
 
Programming Java - Lection 03 - Classes - Lavrentyev Fedor
Programming Java - Lection 03 - Classes - Lavrentyev FedorProgramming Java - Lection 03 - Classes - Lavrentyev Fedor
Programming Java - Lection 03 - Classes - Lavrentyev Fedor
 
Programming Java - Lection 05 - Software Design - Lavrentyev Fedor
Programming Java - Lection 05 - Software Design - Lavrentyev FedorProgramming Java - Lection 05 - Software Design - Lavrentyev Fedor
Programming Java - Lection 05 - Software Design - Lavrentyev Fedor
 
Programming Java - Lection 01 - Basics - Lavrentyev Fedor
Programming Java - Lection 01 - Basics - Lavrentyev FedorProgramming Java - Lection 01 - Basics - Lavrentyev Fedor
Programming Java - Lection 01 - Basics - Lavrentyev Fedor
 
Programming Java - Lection 07 - Puzzlers - Lavrentyev Fedor
Programming Java - Lection 07 - Puzzlers - Lavrentyev FedorProgramming Java - Lection 07 - Puzzlers - Lavrentyev Fedor
Programming Java - Lection 07 - Puzzlers - Lavrentyev Fedor
 
Industrial Programming Java - Lection Pack 02 - Distributed applications - La...
Industrial Programming Java - Lection Pack 02 - Distributed applications - La...Industrial Programming Java - Lection Pack 02 - Distributed applications - La...
Industrial Programming Java - Lection Pack 02 - Distributed applications - La...
 
Programming Java - Lection 04 - Generics and Lambdas - Lavrentyev Fedor
Programming Java - Lection 04 - Generics and Lambdas - Lavrentyev FedorProgramming Java - Lection 04 - Generics and Lambdas - Lavrentyev Fedor
Programming Java - Lection 04 - Generics and Lambdas - Lavrentyev Fedor
 
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
 
Practica 10
Practica 10Practica 10
Practica 10
 
Portafolio de producto
Portafolio de productoPortafolio de producto
Portafolio de producto
 
28´110.795 -- proyecto innovador
28´110.795  -- proyecto innovador28´110.795  -- proyecto innovador
28´110.795 -- proyecto innovador
 
Semantic web: An overview
Semantic web: An overviewSemantic web: An overview
Semantic web: An overview
 

Semelhante a Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor

8. java lecture threads
8. java lecture threads8. java lecture threads
8. java lecture threadsMERA_school
 
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
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Anton Moiseenko
 
Expert Java Day: Java concurrency
Expert Java Day: Java concurrencyExpert Java Day: Java concurrency
Expert Java Day: Java concurrencyPavel Titkov
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммыPlatonov Sergey
 
Java весна 2014 лекция 5
Java весна 2014 лекция 5Java весна 2014 лекция 5
Java весна 2014 лекция 5Technopark
 
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX ThreadsПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX ThreadsAlexey Paznikov
 
Everything you wanted to know about writing async, high-concurrency HTTP apps...
Everything you wanted to know about writing async, high-concurrency HTTP apps...Everything you wanted to know about writing async, high-concurrency HTTP apps...
Everything you wanted to know about writing async, high-concurrency HTTP apps...JavaDayUA
 
Лекция 6
Лекция 6Лекция 6
Лекция 6itc73
 
2012 03 14_parallel_programming_lecture05
2012 03 14_parallel_programming_lecture052012 03 14_parallel_programming_lecture05
2012 03 14_parallel_programming_lecture05Computer Science Club
 
Лекция 13. Многопоточность и GIL
Лекция 13. Многопоточность и GILЛекция 13. Многопоточность и GIL
Лекция 13. Многопоточность и GILRoman Brovko
 
Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Anton Moiseenko
 
Async Javascript
Async JavascriptAsync Javascript
Async JavascriptGetDev.NET
 
C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.Igor Shkulipa
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полнойОмские ИТ-субботники
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Sergey Platonov
 
JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.Igor Shkulipa
 

Semelhante a Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor (20)

8. java lecture threads
8. java lecture threads8. java lecture threads
8. java lecture threads
 
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
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.
 
Expert Java Day: Java concurrency
Expert Java Day: Java concurrencyExpert Java Day: Java concurrency
Expert Java Day: Java concurrency
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
Java весна 2014 лекция 5
Java весна 2014 лекция 5Java весна 2014 лекция 5
Java весна 2014 лекция 5
 
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX ThreadsПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
 
Everything you wanted to know about writing async, high-concurrency HTTP apps...
Everything you wanted to know about writing async, high-concurrency HTTP apps...Everything you wanted to know about writing async, high-concurrency HTTP apps...
Everything you wanted to know about writing async, high-concurrency HTTP apps...
 
Лекция 6
Лекция 6Лекция 6
Лекция 6
 
2012 03 14_parallel_programming_lecture05
2012 03 14_parallel_programming_lecture052012 03 14_parallel_programming_lecture05
2012 03 14_parallel_programming_lecture05
 
Лекция 13. Многопоточность и GIL
Лекция 13. Многопоточность и GILЛекция 13. Многопоточность и GIL
Лекция 13. Многопоточность и GIL
 
Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.
 
Async Javascript
Async JavascriptAsync Javascript
Async Javascript
 
C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
 
Performance optimisation in javascript
Performance optimisation in javascriptPerformance optimisation in javascript
Performance optimisation in javascript
 
JavaDay'14
JavaDay'14JavaDay'14
JavaDay'14
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
Event Machine
Event MachineEvent Machine
Event Machine
 
JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.
 

Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor

  • 1. 6. Многопоточность Программирование на Java Федор Лаврентьев МФТИ, 2016
  • 3. Процесс и поток • Процесс • Выделенная память • Процессорное время расходуется потоками • Порождается через fork • Общается с другими процессами через сокеты и shared memory • Поток • Общая память процесса • Собственный кеш • Расходует процессорное время • Порождается внутри процесса • Общается с другими потоками через общую память процесса
  • 4. java.lang.Thread • start(), run() • static sleep(), static yield() • stop(), destroy() • interrupt(), isInterrupted(), static interrupted() • setDaemon(), isDaemon() • join() • getState(): • NEW • RUNNABLE • BLOCKED • WAITING, TIMED_WAITING • TERMINATED
  • 5. Старт потока через override public void runOverridenThread() { Thread thread = new Thread() { @Override public void run() { // do something } }; thread.start(); }
  • 6. Старт потока с Runnable public void runRunnableInThread() { Thread thread = new Thread(new Runnable() { @Override public void run() { // do something } }); thread.start(); }
  • 7. Прерывание потока public void interruptThread() throws Exception { Thread thread = new Thread(new Runnable() { @Override public void run() { while (!Thread.interrupted()) { // Do something useful } // Thread interrupted } }); thread.start(); Thread.sleep(1); thread.interrupt(); }
  • 8. Прерывание блокирующего вызова public void interruptThread() throws Exception { Thread thread = new Thread(new Runnable() { @Override public void run() { while (!Thread.interrupted()) { // Do something useful try { Thread.sleep(1000); // blocking call } catch (InterruptedException e) { // Thread interrupted } } // Thread interrupted } }); thread.start(); Thread.sleep(1); thread.interrupt(); }
  • 10. synchronized • Критическая секция • Допускается повторное вхождение (reentrant) • Синхронизироваться можно по любому объекту • Необходимо минимизировать размер критических секций • По возможности, дробить критические секции на части • Можно использовать альтернативные блокировки
  • 11. synchronized public static synchronized void sMethod() { // тело метода } public static void sMethodDescribed () { synchronized (SynchronizedExample.class) { // тело метода } } public synchronized void iMethod() { // тело метода } public void iMethodDescribed() { synchronized (this) { // тело метода } } private final Object lock = new Object(); public void anotherObject () { synchronized (lock) { // тело метода } }
  • 12. volatile • Форсирует работу с памятью в обход кешей • Гарантирует атомарное чтение и запись для double и long • Не гарантирует атомарный инкремент private volatile long value;
  • 13. Atomic* • Базируются на операции compareAndSet(previous, next) • Это отдельная инструкция байт-кода JVM • Гарантирует атомарность чтения, записи и инкремента • java.util.concurrent.atomic.*: • AtomicInteger • AtomicLong • AtomicBoolean • AtomicReference<T> • AtomicIntegerArray • AtomicLongArray
  • 14. Atomic incrementAndGet() public class AtomicInteger extends Number { private volatile int value; private native boolean compareAndSet(int current, int next); public final int incrementAndGet () { for (;;) { int current = get(); int next = current + 1; if (compareAndSet(current, next)) { return next; } } } }
  • 15. Atomic getAndIncrement() public class AtomicInteger extends Number { private volatile int value; private native boolean compareAndSet(int current, int next); public final int getAndIncrement() { for (;;) { int current = get(); int next = current + 1; if (compareAndSet(current, next)) { return current; } } } }
  • 16. Immutable • Неизменяемые объекты не нуждаются в синхронизации состояния, а значит, потокобезопасны • Все поля – final (либо не изменяются) • Все mutable параметры конструктора скопированы • Ссылки на внутренние mutable объекты не публикуются • Родительский класс также immutable • Нет утечки ссылки на this из конструктора
  • 18. Deadlock class Account { public int money; } class AccountManager { public void transfer(Account from, Account to, int amount) { assert amount > 0; synchronized (from) { assert from.money >= amount; synchronized (to) { to.money += amount; from.money -= amount; } } } }
  • 19. Lock ordering class Account { public int money; public final long id; } class AccountManager { public void transfer(Account from, Account to, int amount) { assert amount > 0; assert from.number != to.number; Object first = from.number < to.number ? from : to; Object second = from.number < to.number ? to : from; synchronized (first) { synchronized (second) { to.money += amount; from.money -= amount; } } } }
  • 20. Livelock • Поток успешно получает блокировку, однако выполнить полезное действие не может • Два потока конфликтуют, откатывают результаты своей работы и пытаются через фиксированное время повторить попытку (например, делают sleep(1000)). • При следующей попытке они опять будут конфликтовать • Пример – задача про обедающих философов • Решение – случайная задержка
  • 21. Starvation • Бесконечные циклы – холостая утилизация CPU • sleep при взятой блокировке • Blocking IO при взятой блокировке • Неоптимальные приоритеты потоков в ОС
  • 22. Решение проблем • Не использовать многопоточность • Не разделять состояние между потоками • Разделять только immutable-состояние • Использовать lock-free алгоритмы • Использовать готовые примитивы синхронизации • Аккуратнее программировать синхронизацию
  • 24. Lock (ReentrantLock) • lock() • unlock() • tryLock() • tryLock(long timeout)
  • 25. ReadWriteLock • readLock().lock() • readLock().unlock() • writeLock().lock() • writeLock().unlock() http://www.java67.com/2012/08/5-thread-interview-questions-answers-in.html
  • 26. CountDownLatch • new CountDownLatch(int count) • await() • countDown() http://www.topjavatutorial.com/java/countdownlatch-in-java/
  • 27. А также • Semaphore • CyclicBarrier • Exchanger • Phaser
  • 28. Concurrent-коллекции • Vector, Stack, Hashtable • Collections.synchronized*() • ConcurrentHashMap, ConcurrentSkipListMap • CopyOnWriteArrayList, CopyOnWriteArraySet • BlockingQueue – ArrayBQ, LinkedBQ • ConcurrentLinkedQueue

Notas do Editor

  1. Unmodifiable-коллекции