SlideShare a Scribd company logo
1 of 27
Параллелизм и потоки вПараллелизм и потоки в
JavaJava
For students of universityFor students of university
Author: Oxana DudnikAuthor: Oxana Dudnik
Создание потокаСоздание потока
Существует два способа:Существует два способа:
реализацией интерфейсареализацией интерфейса RunnableRunnable;;
class MyClass implements Runnable {class MyClass implements Runnable {
public void run() {public void run() {
// тело метода// тело метода runrun
}}
}}
наследованием классанаследованием класса ThreadThread..
class MyClass extends Thread {class MyClass extends Thread {
public void run() {public void run() {
// тело метода// тело метода runrun()()
}}
}}
Запуск потокаЗапуск потока
Пришло время запустить поток. Это настолькоПришло время запустить поток. Это настолько
просто, что врядли заслуживает отдельногопросто, что врядли заслуживает отдельного
раздела:раздела:
t.start();t.start();
Что происходит после старта потока? АЧто происходит после старта потока? А
происходит следующее:происходит следующее:
Стартует новый поток выполнения (с новымСтартует новый поток выполнения (с новым
стэком вызовов).стэком вызовов).
Поток переходит из состояния new (новый) вПоток переходит из состояния new (новый) в
состояние работоспособный (runnable).состояние работоспособный (runnable).
Когда поток получает шанс выполниться, онКогда поток получает шанс выполниться, он
вызывает метод run().вызывает метод run().
Планировщик потоковПланировщик потоков
Планировщик потоков является частьюПланировщик потоков является частью
JVM (хотя некоторые JVM мапят Java-JVM (хотя некоторые JVM мапят Java-
потоки на нативные потоки ОС) ипотоки на нативные потоки ОС) и
решает какой поток будет работать врешает какой поток будет работать в
определенный момент.определенный момент.
Любой поток, имеющий состояниеЛюбой поток, имеющий состояние
runnable (работоспособный), может бытьrunnable (работоспособный), может быть
выбран планировщиком длявыбран планировщиком для
выполнения.выполнения.
Состояния потоковСостояния потоков
Управление выполнениемУправление выполнением
потоковпотоков
sleepsleep((long millislong millis);); - задает задержку в- задает задержку в
миллисекундах;миллисекундах;
sleepsleep((long millislong millis,, int nanosint nanos)) – задает задержку в– задает задержку в
миллисекундах и наносекундах.миллисекундах и наносекундах.
Приостановка потока, с передачей управленияПриостановка потока, с передачей управления
другому потоку производится статическимдругому потоку производится статическим
методомметодом yieldyield().().
Прервать работу выполняемого потока можно сПрервать работу выполняемого потока можно с
помощью методапомощью метода interruptinterrupt().().
Чтобы определить состояние потокаЧтобы определить состояние потока
используется методиспользуется метод isAliveisAlive().().
Иногда, для выполнения потока необходимоИногда, для выполнения потока необходимо
дождаться завершения другого потока. В этихдождаться завершения другого потока. В этих
случаях вам поможет методслучаях вам поможет метод joinjoin().().
start(). Запускает поток на
выполнение.
stop(). Заканчивает выполнение
потока.
sleep(long msec). Останавливает
выполнение потока на указанное
количество миллисекунд.
yield(). Передает ресурсов процессора
другому потоку.
suspend(). Приостанавливает
выполнение потока.
resume(). Возобновляет выполнение
потока.
SynchronizedSynchronized
Synchronized objectSynchronized object
Object sync =Object sync = newnew Object(); ...Object(); ...
synchronizedsynchronized(sync){ }(sync){ }
Synchronized methodSynchronized method
public synchronized voidpublic synchronized void
someMethod(){ // code }someMethod(){ // code }
... полностью эквивалентно... полностью эквивалентно
следующей конструкции:следующей конструкции:
public voidpublic void someMethod()someMethod()
{{ synchronizedsynchronized((thisthis){ // code } }){ // code } }
Synchronized classSynchronized class
public classpublic class SomeClass{SomeClass{ public staticpublic static
synchronized voidsynchronized void someMethod(){someMethod(){
//code }//code }
}}
. эквивалентно:. эквивалентно:
public classpublic class SomeClass{SomeClass{ public staticpublic static
voidvoid someMethod()someMethod()
{{ synchronizedsynchronized(SomeClass.(SomeClass.classclass){){
//code } }//code } }
}}
Взаимные блокировки,Взаимные блокировки, deadlocksdeadlocks
Что такое взаимная блокировка по своейЧто такое взаимная блокировка по своей
сути? Все достаточно просто.сути? Все достаточно просто.
Предположим, что один поток ужеПредположим, что один поток уже
захватил монитор на некотором объектезахватил монитор на некотором объекте
x и для продолжения работы ему нужноx и для продолжения работы ему нужно
захватить монитор на объекте y.захватить монитор на объекте y.
В другом же потоке ситуация ровноВ другом же потоке ситуация ровно
обратная – он уже захватил монитор наобратная – он уже захватил монитор на
объекте y и ему нужен монитор объектаобъекте y и ему нужен монитор объекта
x.x.
В результате оба потока будут ждать,В результате оба потока будут ждать,
пока нужный монитор освободится. Какпока нужный монитор освободится. Как
вы сами прекрасно понимаете, ждатьвы сами прекрасно понимаете, ждать
они будут до бесконечности.они будут до бесконечности.
Эта ситуация и называетсяЭта ситуация и называется взаимнойвзаимной
блокировкойблокировкой –– deadlockdeadlock..
Перечислите известные Вам способыПеречислите известные Вам способы
1)избежать 2)побороть возникшие1)избежать 2)побороть возникшие
deadlock-и (представьте, что вы пишетеdeadlock-и (представьте, что вы пишете
ядро RDBMS).ядро RDBMS).
Чтобы избежать дедлоков -Чтобы избежать дедлоков -
Захватывать везде ресурсы в одинаковомЗахватывать везде ресурсы в одинаковом
порядкепорядке
или знать заранее какие ресурсы в какомили знать заранее какие ресурсы в каком
порядке будут захвачены — строить графпорядке будут захвачены — строить граф
переходов м-ду состояниямипереходов м-ду состояниями
Чтобы побороть дедлокЧтобы побороть дедлок
использовать тул для детекта заблокированныхиспользовать тул для детекта заблокированных
потоковпотоков
использовать эвристику вида — убивать одиниспользовать эвристику вида — убивать один
из двух потоков если оба взаимно блокируютиз двух потоков если оба взаимно блокируют
друг друга. например можно поделить потокидруг друга. например можно поделить потоки
на молодые и старые. более молодые потокина молодые и старые. более молодые потоки
можно убивать при обнаружении что онможно убивать при обнаружении что он
пытается захватить ресурс используемый болеепытается захватить ресурс используемый более
старым потоком.старым потоком.
StarvationStarvation
Название starvation полностью соответствуетНазвание starvation полностью соответствует
проблеме. Когда множество потоков постояннопроблеме. Когда множество потоков постоянно
находятся в борьбе за один критическийнаходятся в борьбе за один критический
ресурс, то все ждут, пока кто-то одинресурс, то все ждут, пока кто-то один
освободит этот ресурс. Потом из ждущих поосвободит этот ресурс. Потом из ждущих по
какому-либо алгоритму выбирается только кто-какому-либо алгоритму выбирается только кто-
то один, кто следующим захватит ресурс.то один, кто следующим захватит ресурс.
Таким образом, может найтись один такойТаким образом, может найтись один такой
поток, который никогда не получит доступ кпоток, который никогда не получит доступ к
ресурсу, потому что другие потоки постоянноресурсу, потому что другие потоки постоянно
захватывают ресурс раньше него.захватывают ресурс раньше него.
livelocklivelock
livelock частая проблема в асинхронныхlivelock частая проблема в асинхронных
системах. Там потоки почти не блокируются насистемах. Там потоки почти не блокируются на
критических ресурсах. Вместо этого оникритических ресурсах. Вместо этого они
выполняют свою небольшую неблокируемуювыполняют свою небольшую неблокируемую
задачу и отправляют её в очередь назадачу и отправляют её в очередь на
обработку другими потоками. Можетобработку другими потоками. Может
возникнуть ситуация, когда потоки друг другувозникнуть ситуация, когда потоки друг другу
начинают перекидывать какое-то событие и егоначинают перекидывать какое-то событие и его
обработка зацикливается. Явного бесконечногообработка зацикливается. Явного бесконечного
цикла, как бы, не происходит, но нагрузка нацикла, как бы, не происходит, но нагрузка на
асинхронную систему резко возрастает. Васинхронную систему резко возрастает. В
результате чего эти потоки больше ничем нерезультате чего эти потоки больше ничем не
успевают занимаются.успевают занимаются.
ModificatorModificator volatilevolatile
определение переменной с ключевымопределение переменной с ключевым
словом volatile(«изменчивый») означает,словом volatile(«изменчивый») означает,
что значение переменной будетчто значение переменной будет
изменяться разными потоками.изменяться разными потоками.
чтение volatile переменныхчтение volatile переменных
синхронизировано и запись в volatileсинхронизировано и запись в volatile
переменные синхронизирована, апеременные синхронизирована, а
неатомарные операции – нет.неатомарные операции – нет.
Что означает, что следующий код неЧто означает, что следующий код не
безопасен для потоков:безопасен для потоков:
myVolatileVar++;myVolatileVar++;
Non-volitile variableNon-volitile variable
Volitile variableVolitile variable
В чем разница между volatile иВ чем разница между volatile и
synchronized?synchronized?
synchronized имеет два важных момента: это гарантияsynchronized имеет два важных момента: это гарантия
того, что только один поток выполняет секцию кода втого, что только один поток выполняет секцию кода в
один момент времени (взаимоисключение или mutex), иодин момент времени (взаимоисключение или mutex), и
также гарантия того, что данные, изменённые однимтакже гарантия того, что данные, изменённые одним
потоком, будут видны всем другим потокам (видимостьпотоком, будут видны всем другим потокам (видимость
изменений).изменений).
volatile проще, нежели синхронизация и подходит толькоvolatile проще, нежели синхронизация и подходит только
для контроля доступа к одиночному экземпляру илидля контроля доступа к одиночному экземпляру или
переменной примитивного типа: int, boolean... Когдапеременной примитивного типа: int, boolean... Когда
переменная объявлена как volatile, любая запись еёпеременная объявлена как volatile, любая запись её
будет осуществляться прямо в память, минуя кеш. Такжебудет осуществляться прямо в память, минуя кеш. Также
как и считываться будет прямо из памяти, а не изкак и считываться будет прямо из памяти, а не из
всевозможного кеша. Это значит, что все потоки будутвсевозможного кеша. Это значит, что все потоки будут
"видеть" одно и то же значение переменной"видеть" одно и то же значение переменной
одновременно.одновременно.
LiteratureLiterature
https://www.youtube.com/watch?v=1WfbAs6Zhttps://www.youtube.com/watch?v=1WfbAs6Z
https://www.youtube.com/watch?v=RrDaXkiXhttps://www.youtube.com/watch?v=RrDaXkiX
https://www.youtube.com/watch?v=J1IYHMPMhttps://www.youtube.com/watch?v=J1IYHMPM
http://echuprina.blogspot.com/2012/02/java-1http://echuprina.blogspot.com/2012/02/java-1
http://www.skipy.ru/technics/synchronization.http://www.skipy.ru/technics/synchronization.

More Related Content

What's hot

Чему мы научились разрабатывая микросервисы?
Чему мы научились разрабатывая микросервисы?Чему мы научились разрабатывая микросервисы?
Чему мы научились разрабатывая микросервисы?
Vadim Madison
 
колышкин Rootconf 2009 Openvz
колышкин Rootconf 2009 Openvzколышкин Rootconf 2009 Openvz
колышкин Rootconf 2009 Openvz
Liudmila Li
 
Java весна 2014 лекция 5
Java весна 2014 лекция 5Java весна 2014 лекция 5
Java весна 2014 лекция 5
Technopark
 
Опыт внедрения и использования распределенной системы хранения данных на осно...
Опыт внедрения и использования распределенной системы хранения данных на осно...Опыт внедрения и использования распределенной системы хранения данных на осно...
Опыт внедрения и использования распределенной системы хранения данных на осно...
tfmailru
 
Android осень 2013 лекция 3
Android осень 2013 лекция 3Android осень 2013 лекция 3
Android осень 2013 лекция 3
Technopark
 
Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)
Ontico
 

What's hot (20)

Java. Многопоточность.
Java. Многопоточность.Java. Многопоточность.
Java. Многопоточность.
 
Чему мы научились разрабатывая микросервисы?
Чему мы научились разрабатывая микросервисы?Чему мы научились разрабатывая микросервисы?
Чему мы научились разрабатывая микросервисы?
 
колышкин Rootconf 2009 Openvz
колышкин Rootconf 2009 Openvzколышкин Rootconf 2009 Openvz
колышкин Rootconf 2009 Openvz
 
Живая миграция: плюсы, минусы и подводные камни - Павел Емельянов
Живая миграция: плюсы, минусы и подводные камни - Павел ЕмельяновЖивая миграция: плюсы, минусы и подводные камни - Павел Емельянов
Живая миграция: плюсы, минусы и подводные камни - Павел Емельянов
 
Живая миграция контейнеров: плюсы, минусы, подводные камни -- Павел Емельянов
Живая миграция контейнеров: плюсы, минусы, подводные камни -- Павел ЕмельяновЖивая миграция контейнеров: плюсы, минусы, подводные камни -- Павел Емельянов
Живая миграция контейнеров: плюсы, минусы, подводные камни -- Павел Емельянов
 
Java весна 2014 лекция 5
Java весна 2014 лекция 5Java весна 2014 лекция 5
Java весна 2014 лекция 5
 
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
 
Введение в сетевые технологии
Введение в сетевые технологииВведение в сетевые технологии
Введение в сетевые технологии
 
Expert Java Day: Java concurrency
Expert Java Day: Java concurrencyExpert Java Day: Java concurrency
Expert Java Day: Java concurrency
 
Date & Time in Java SE 8
Date & Time in Java SE 8Date & Time in Java SE 8
Date & Time in Java SE 8
 
Java. Сборщик мусора. Работа с памятью.
Java.  Сборщик мусора. Работа с памятью. Java.  Сборщик мусора. Работа с памятью.
Java. Сборщик мусора. Работа с памятью.
 
Опыт внедрения и использования распределенной системы хранения данных на осно...
Опыт внедрения и использования распределенной системы хранения данных на осно...Опыт внедрения и использования распределенной системы хранения данных на осно...
Опыт внедрения и использования распределенной системы хранения данных на осно...
 
Java threads - part 3
Java threads - part 3Java threads - part 3
Java threads - part 3
 
Java threads - part 1
Java threads - part 1Java threads - part 1
Java threads - part 1
 
Секреты сборки мусора в Java
Секреты сборки мусора в JavaСекреты сборки мусора в Java
Секреты сборки мусора в Java
 
Как мы в Почте@Mail.Ru выдерживаем высокие нагрузки
Как мы в Почте@Mail.Ru выдерживаем высокие нагрузкиКак мы в Почте@Mail.Ru выдерживаем высокие нагрузки
Как мы в Почте@Mail.Ru выдерживаем высокие нагрузки
 
Android осень 2013 лекция 3
Android осень 2013 лекция 3Android осень 2013 лекция 3
Android осень 2013 лекция 3
 
Класс!ная Cassandra
Класс!ная CassandraКласс!ная Cassandra
Класс!ная Cassandra
 
Внутреннее устройство GC
Внутреннее устройство GCВнутреннее устройство GC
Внутреннее устройство GC
 
Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)
 

Similar to Threads in java

Теоретический минимум для понимания Java Memory Model (для JPoint 2014)
Теоретический минимум для понимания Java Memory Model (для JPoint 2014)Теоретический минимум для понимания Java Memory Model (для JPoint 2014)
Теоретический минимум для понимания Java Memory Model (для JPoint 2014)
Roman Elizarov
 
8. java lecture threads
8. java lecture threads8. java lecture threads
8. java lecture threads
MERA_school
 
Многопоточные Алгоритмы (для BitByte 2014)
Многопоточные Алгоритмы (для BitByte 2014)Многопоточные Алгоритмы (для BitByte 2014)
Многопоточные Алгоритмы (для BitByte 2014)
Roman Elizarov
 
Multiprocessor Programming Intro (lecture 2)
Multiprocessor Programming Intro (lecture 2)Multiprocessor Programming Intro (lecture 2)
Multiprocessor Programming Intro (lecture 2)
Dmitry Tsitelov
 
Usage concurrence in java
Usage concurrence in javaUsage concurrence in java
Usage concurrence in java
Asya Dudnik
 

Similar to Threads in java (20)

Step 7
Step 7Step 7
Step 7
 
Working with .NET Threads
Working with .NET ThreadsWorking with .NET Threads
Working with .NET Threads
 
ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS
 
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.
 
ZooKeeper Java Cloud
ZooKeeper Java CloudZooKeeper Java Cloud
ZooKeeper Java Cloud
 
Теоретический минимум для понимания Java Memory Model (для JPoint 2014)
Теоретический минимум для понимания Java Memory Model (для JPoint 2014)Теоретический минимум для понимания Java Memory Model (для JPoint 2014)
Теоретический минимум для понимания Java Memory Model (для JPoint 2014)
 
8. java lecture threads
8. java lecture threads8. java lecture threads
8. java lecture threads
 
Lab5
Lab5Lab5
Lab5
 
Linux (pipes)
Linux (pipes) Linux (pipes)
Linux (pipes)
 
Многопоточные Алгоритмы (для BitByte 2014)
Многопоточные Алгоритмы (для BitByte 2014)Многопоточные Алгоритмы (для BitByte 2014)
Многопоточные Алгоритмы (для BitByte 2014)
 
Операционные системы 2015, лекция № 5
Операционные системы 2015, лекция № 5Операционные системы 2015, лекция № 5
Операционные системы 2015, лекция № 5
 
Multiprocessor Programming Intro (lecture 2)
Multiprocessor Programming Intro (lecture 2)Multiprocessor Programming Intro (lecture 2)
Multiprocessor Programming Intro (lecture 2)
 
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX ThreadsПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
 
Multi threads
Multi threadsMulti threads
Multi threads
 
Usage concurrence in java
Usage concurrence in javaUsage concurrence in java
Usage concurrence in java
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.
 
Выявление неполадок в Java приложениях
Выявление неполадок в Java приложенияхВыявление неполадок в Java приложениях
Выявление неполадок в Java приложениях
 
Atomics, CAS and Nonblocking algorithms
Atomics, CAS and Nonblocking algorithmsAtomics, CAS and Nonblocking algorithms
Atomics, CAS and Nonblocking algorithms
 
java
javajava
java
 
Другая виртуализация
Другая виртуализацияДругая виртуализация
Другая виртуализация
 

More from Asya Dudnik

использование Hibernate java persistence.part 4.
использование Hibernate java persistence.part 4.использование Hibernate java persistence.part 4.
использование Hibernate java persistence.part 4.
Asya Dudnik
 
использование Hibernate java persistence.part 2.
использование Hibernate java persistence.part 2.использование Hibernate java persistence.part 2.
использование Hibernate java persistence.part 2.
Asya Dudnik
 

More from Asya Dudnik (20)

Get started with docker & dev ops
Get started with docker & dev opsGet started with docker & dev ops
Get started with docker & dev ops
 
Get started with docker & dev ops
Get started with docker & dev opsGet started with docker & dev ops
Get started with docker & dev ops
 
Work with my_sql_-_database_in_java
Work with my_sql_-_database_in_javaWork with my_sql_-_database_in_java
Work with my_sql_-_database_in_java
 
Oracle database
Oracle databaseOracle database
Oracle database
 
Work with xml in java
Work with xml in javaWork with xml in java
Work with xml in java
 
Jdbc in java
Jdbc in javaJdbc in java
Jdbc in java
 
Java.fundamentals
Java.fundamentalsJava.fundamentals
Java.fundamentals
 
Data bases in pictures
Data bases in picturesData bases in pictures
Data bases in pictures
 
использование Hibernate java persistence.part 4.
использование Hibernate java persistence.part 4.использование Hibernate java persistence.part 4.
использование Hibernate java persistence.part 4.
 
Hibernate&ejb3 . part3.
Hibernate&ejb3 . part3.Hibernate&ejb3 . part3.
Hibernate&ejb3 . part3.
 
использование Hibernate java persistence.part 2.
использование Hibernate java persistence.part 2.использование Hibernate java persistence.part 2.
использование Hibernate java persistence.part 2.
 
Work with my sql database in java
Work with my sql   database in javaWork with my sql   database in java
Work with my sql database in java
 
Java.fundamentals
Java.fundamentalsJava.fundamentals
Java.fundamentals
 
Web&java. gwt
Web&java. gwtWeb&java. gwt
Web&java. gwt
 
Web&java.jsf.
Web&java.jsf.Web&java.jsf.
Web&java.jsf.
 
Web&java. jsp
Web&java. jspWeb&java. jsp
Web&java. jsp
 
Web&java. jsp
Web&java. jspWeb&java. jsp
Web&java. jsp
 
Java fx for interface
Java fx for interfaceJava fx for interface
Java fx for interface
 
Java fx for interface
Java fx for interfaceJava fx for interface
Java fx for interface
 
Apache maven in java projects
Apache maven in java projectsApache maven in java projects
Apache maven in java projects
 

Threads in java

  • 1. Параллелизм и потоки вПараллелизм и потоки в JavaJava For students of universityFor students of university Author: Oxana DudnikAuthor: Oxana Dudnik
  • 2.
  • 3.
  • 4.
  • 5. Создание потокаСоздание потока Существует два способа:Существует два способа: реализацией интерфейсареализацией интерфейса RunnableRunnable;; class MyClass implements Runnable {class MyClass implements Runnable { public void run() {public void run() { // тело метода// тело метода runrun }} }} наследованием классанаследованием класса ThreadThread.. class MyClass extends Thread {class MyClass extends Thread { public void run() {public void run() { // тело метода// тело метода runrun()() }} }}
  • 6. Запуск потокаЗапуск потока Пришло время запустить поток. Это настолькоПришло время запустить поток. Это настолько просто, что врядли заслуживает отдельногопросто, что врядли заслуживает отдельного раздела:раздела: t.start();t.start(); Что происходит после старта потока? АЧто происходит после старта потока? А происходит следующее:происходит следующее: Стартует новый поток выполнения (с новымСтартует новый поток выполнения (с новым стэком вызовов).стэком вызовов). Поток переходит из состояния new (новый) вПоток переходит из состояния new (новый) в состояние работоспособный (runnable).состояние работоспособный (runnable). Когда поток получает шанс выполниться, онКогда поток получает шанс выполниться, он вызывает метод run().вызывает метод run().
  • 7. Планировщик потоковПланировщик потоков Планировщик потоков является частьюПланировщик потоков является частью JVM (хотя некоторые JVM мапят Java-JVM (хотя некоторые JVM мапят Java- потоки на нативные потоки ОС) ипотоки на нативные потоки ОС) и решает какой поток будет работать врешает какой поток будет работать в определенный момент.определенный момент. Любой поток, имеющий состояниеЛюбой поток, имеющий состояние runnable (работоспособный), может бытьrunnable (работоспособный), может быть выбран планировщиком длявыбран планировщиком для выполнения.выполнения.
  • 9. Управление выполнениемУправление выполнением потоковпотоков sleepsleep((long millislong millis);); - задает задержку в- задает задержку в миллисекундах;миллисекундах; sleepsleep((long millislong millis,, int nanosint nanos)) – задает задержку в– задает задержку в миллисекундах и наносекундах.миллисекундах и наносекундах. Приостановка потока, с передачей управленияПриостановка потока, с передачей управления другому потоку производится статическимдругому потоку производится статическим методомметодом yieldyield().(). Прервать работу выполняемого потока можно сПрервать работу выполняемого потока можно с помощью методапомощью метода interruptinterrupt().(). Чтобы определить состояние потокаЧтобы определить состояние потока используется методиспользуется метод isAliveisAlive().(). Иногда, для выполнения потока необходимоИногда, для выполнения потока необходимо дождаться завершения другого потока. В этихдождаться завершения другого потока. В этих случаях вам поможет методслучаях вам поможет метод joinjoin().().
  • 10. start(). Запускает поток на выполнение. stop(). Заканчивает выполнение потока. sleep(long msec). Останавливает выполнение потока на указанное количество миллисекунд. yield(). Передает ресурсов процессора другому потоку. suspend(). Приостанавливает выполнение потока. resume(). Возобновляет выполнение потока.
  • 12. Synchronized objectSynchronized object Object sync =Object sync = newnew Object(); ...Object(); ... synchronizedsynchronized(sync){ }(sync){ }
  • 13. Synchronized methodSynchronized method public synchronized voidpublic synchronized void someMethod(){ // code }someMethod(){ // code } ... полностью эквивалентно... полностью эквивалентно следующей конструкции:следующей конструкции: public voidpublic void someMethod()someMethod() {{ synchronizedsynchronized((thisthis){ // code } }){ // code } }
  • 14. Synchronized classSynchronized class public classpublic class SomeClass{SomeClass{ public staticpublic static synchronized voidsynchronized void someMethod(){someMethod(){ //code }//code } }} . эквивалентно:. эквивалентно: public classpublic class SomeClass{SomeClass{ public staticpublic static voidvoid someMethod()someMethod() {{ synchronizedsynchronized(SomeClass.(SomeClass.classclass){){ //code } }//code } } }}
  • 15. Взаимные блокировки,Взаимные блокировки, deadlocksdeadlocks Что такое взаимная блокировка по своейЧто такое взаимная блокировка по своей сути? Все достаточно просто.сути? Все достаточно просто. Предположим, что один поток ужеПредположим, что один поток уже захватил монитор на некотором объектезахватил монитор на некотором объекте x и для продолжения работы ему нужноx и для продолжения работы ему нужно захватить монитор на объекте y.захватить монитор на объекте y. В другом же потоке ситуация ровноВ другом же потоке ситуация ровно обратная – он уже захватил монитор наобратная – он уже захватил монитор на объекте y и ему нужен монитор объектаобъекте y и ему нужен монитор объекта x.x. В результате оба потока будут ждать,В результате оба потока будут ждать, пока нужный монитор освободится. Какпока нужный монитор освободится. Как вы сами прекрасно понимаете, ждатьвы сами прекрасно понимаете, ждать они будут до бесконечности.они будут до бесконечности. Эта ситуация и называетсяЭта ситуация и называется взаимнойвзаимной блокировкойблокировкой –– deadlockdeadlock..
  • 16.
  • 17.
  • 18. Перечислите известные Вам способыПеречислите известные Вам способы 1)избежать 2)побороть возникшие1)избежать 2)побороть возникшие deadlock-и (представьте, что вы пишетеdeadlock-и (представьте, что вы пишете ядро RDBMS).ядро RDBMS). Чтобы избежать дедлоков -Чтобы избежать дедлоков - Захватывать везде ресурсы в одинаковомЗахватывать везде ресурсы в одинаковом порядкепорядке или знать заранее какие ресурсы в какомили знать заранее какие ресурсы в каком порядке будут захвачены — строить графпорядке будут захвачены — строить граф переходов м-ду состояниямипереходов м-ду состояниями Чтобы побороть дедлокЧтобы побороть дедлок использовать тул для детекта заблокированныхиспользовать тул для детекта заблокированных потоковпотоков использовать эвристику вида — убивать одиниспользовать эвристику вида — убивать один из двух потоков если оба взаимно блокируютиз двух потоков если оба взаимно блокируют друг друга. например можно поделить потокидруг друга. например можно поделить потоки на молодые и старые. более молодые потокина молодые и старые. более молодые потоки можно убивать при обнаружении что онможно убивать при обнаружении что он пытается захватить ресурс используемый болеепытается захватить ресурс используемый более старым потоком.старым потоком.
  • 19. StarvationStarvation Название starvation полностью соответствуетНазвание starvation полностью соответствует проблеме. Когда множество потоков постояннопроблеме. Когда множество потоков постоянно находятся в борьбе за один критическийнаходятся в борьбе за один критический ресурс, то все ждут, пока кто-то одинресурс, то все ждут, пока кто-то один освободит этот ресурс. Потом из ждущих поосвободит этот ресурс. Потом из ждущих по какому-либо алгоритму выбирается только кто-какому-либо алгоритму выбирается только кто- то один, кто следующим захватит ресурс.то один, кто следующим захватит ресурс. Таким образом, может найтись один такойТаким образом, может найтись один такой поток, который никогда не получит доступ кпоток, который никогда не получит доступ к ресурсу, потому что другие потоки постоянноресурсу, потому что другие потоки постоянно захватывают ресурс раньше него.захватывают ресурс раньше него.
  • 20. livelocklivelock livelock частая проблема в асинхронныхlivelock частая проблема в асинхронных системах. Там потоки почти не блокируются насистемах. Там потоки почти не блокируются на критических ресурсах. Вместо этого оникритических ресурсах. Вместо этого они выполняют свою небольшую неблокируемуювыполняют свою небольшую неблокируемую задачу и отправляют её в очередь назадачу и отправляют её в очередь на обработку другими потоками. Можетобработку другими потоками. Может возникнуть ситуация, когда потоки друг другувозникнуть ситуация, когда потоки друг другу начинают перекидывать какое-то событие и егоначинают перекидывать какое-то событие и его обработка зацикливается. Явного бесконечногообработка зацикливается. Явного бесконечного цикла, как бы, не происходит, но нагрузка нацикла, как бы, не происходит, но нагрузка на асинхронную систему резко возрастает. Васинхронную систему резко возрастает. В результате чего эти потоки больше ничем нерезультате чего эти потоки больше ничем не успевают занимаются.успевают занимаются.
  • 21.
  • 22.
  • 23. ModificatorModificator volatilevolatile определение переменной с ключевымопределение переменной с ключевым словом volatile(«изменчивый») означает,словом volatile(«изменчивый») означает, что значение переменной будетчто значение переменной будет изменяться разными потоками.изменяться разными потоками. чтение volatile переменныхчтение volatile переменных синхронизировано и запись в volatileсинхронизировано и запись в volatile переменные синхронизирована, апеременные синхронизирована, а неатомарные операции – нет.неатомарные операции – нет. Что означает, что следующий код неЧто означает, что следующий код не безопасен для потоков:безопасен для потоков: myVolatileVar++;myVolatileVar++;
  • 26. В чем разница между volatile иВ чем разница между volatile и synchronized?synchronized? synchronized имеет два важных момента: это гарантияsynchronized имеет два важных момента: это гарантия того, что только один поток выполняет секцию кода втого, что только один поток выполняет секцию кода в один момент времени (взаимоисключение или mutex), иодин момент времени (взаимоисключение или mutex), и также гарантия того, что данные, изменённые однимтакже гарантия того, что данные, изменённые одним потоком, будут видны всем другим потокам (видимостьпотоком, будут видны всем другим потокам (видимость изменений).изменений). volatile проще, нежели синхронизация и подходит толькоvolatile проще, нежели синхронизация и подходит только для контроля доступа к одиночному экземпляру илидля контроля доступа к одиночному экземпляру или переменной примитивного типа: int, boolean... Когдапеременной примитивного типа: int, boolean... Когда переменная объявлена как volatile, любая запись еёпеременная объявлена как volatile, любая запись её будет осуществляться прямо в память, минуя кеш. Такжебудет осуществляться прямо в память, минуя кеш. Также как и считываться будет прямо из памяти, а не изкак и считываться будет прямо из памяти, а не из всевозможного кеша. Это значит, что все потоки будутвсевозможного кеша. Это значит, что все потоки будут "видеть" одно и то же значение переменной"видеть" одно и то же значение переменной одновременно.одновременно.