SlideShare une entreprise Scribd logo
1  sur  50
Télécharger pour lire hors ligne
Углубленное
программирование на
Java

Лекция 5
«Многопоточность»
Виталий Чибриков
План лекции
2
1. Thread, Runnable=
2. Frontend и
Account Service=
3. Concurrent
Collections=
4. Message System
Processes and Threads
3
Процессы
Приложение со своим набором run-time ресурсов и собственной памятью
Взаимодействие через Inter Process Communication ресурсы
Можно запускать на нескольких компьютерах
Потоки
«Живут» в одном процессе
Старт приложения – создание main потока
Используют общую память (heap) и другие ресурсы приложения
Потоки могут порождать другие потоки и взаимодействовать с ними
Что такое поток?
4
Поток
Объект, у класса которого есть методы start() и run()
После вызова метода start() будет выполнен run()
Метод run() будет выполнен в своем стеке
Threads
5
main
T1.run()
T2.run()
T1.start()
T2.start()
t
Порядок не определен
6
main
T1.run()
T2.run()
T1.start()
T2.start()
t
Роль операционной системы
7
Операционная система
Создает потоки
Переключает потоки
Следит за мониторами
interface Runnable
8
Всего один метод – run()
Runnable
Поток это объект, реазизующий интерфейс Runnable
public class HelloRunnable implements Runnable {
G
public void run() {
System.out.println("Hello from a thread!");
}
public static void main(String args[]) {
(new Thread(new HelloRunnable())).start();
}
}
class Thread
9
class MyThread extends Thread
Thread содержит метод start() ― запуск нового потока
сlass Thread реализует интерфейс Runnable
public class HelloThread extends Thread {
public void run() {
System.out.println("Hello from a thread!");
}
G
public static void main(String args[]) {
(new HelloThread()).start();
}
}
Runnable
Runnable vs Thread
10
Runnable класс нужно передавать в конструктор Thread объекта
Можно наследовать класс отличный от Thread
Thread
Содержит методы управления потоком
Thread thread = Thread.currentThread();
Текущий Thread object можно получить в любом месте кода
Доступ к объекту потока
Текущий Thread object можно получить в любом месте кода
long getId()
String getName()
int getPriority()
void setPriority(int priority)
static void sleep(long ms)
void interrupt()
static boolean interrupted()
void join()
11
Thread thread = Thread.currentThread();
Некоторые методы
sleep and interrupt
Если нужно остановить выполнение потока
Thread.sleep(1000) – остановит выполнение потока на 1
секунду
Если нужно прервать выполнение потока
thread.interrupt() – пошлет прерывание потоку thread
try {
Thread.sleep(5000);
} catch (InterruptedException e) { // We've been interrupted.
return;
}
G
for (int i = 0; i < inputs.length; i++) {
heavyTask(inputs[i]);
if (Thread.interrupted()) { // We've been interrupted.
return;
}
} 12
Если надо остановить текущий поток до окончания другого
потока
join
13
Текущий поток ждет пока завершиться поток thread
В текущем потоке вызываем thread.join().
public class HelloThread extends Thread {
public void run() {
System.out.println(“1. Hello from a thread!");
}
public static void main(String args[]) {
Thread thread = new HelloThread();
thread.start();
thread.join();
System.out.println(“2. Hello from the main!");
}
}
Взаимодействие потоков
У потоков общий Heap
Можно передать в два потока ссылку на один объект
Потоки смогут менять общий объект и взаимодействовать через
него
14
Как осуществить взаимодействие между
потоками?
Java memory model
Memory model + volatile
15
volatile – не кэшировать, всегда считывать из общей памяти
Описывает то, как потоки должны взаимодействовать через общую память
Кэширование значений в многопроцессорных средах
Изменение порядка операций для оптимизации
Основные проблемы
final – не изменять значение переменной
synchronized – отметить участок кода доступный только одному треду
Инструменты для решения
Synchronization
Демонстрация работы кода ThreadInterference.example();
Возможные ошибки одновременного
доступа
Thread Interference – потеря результата
Memory Consistency Errors – ошибочное состояние общей памяти
16
Synchronization
public synchronized void increment() {
++i;
}
public void addName(String name) {
synchronized(lockObject) {
lastName = name;
nameCount++;
}
nameList.add(name);
}
17
Synchronized methods
Synchronized statements
Lock object (mutex)
public class TwoLocks {
private long c1 = 0;
private long c2 = 0;
private Object lock1 = new Object(); //the first lock
private Object lock2 = new Object(); //the second lock
public void c1Up() {
synchronized(lock1) {
c1++;
}
}
G
public void c2Up() {
synchronized(lock2) {
c2++;
}
}
}
18
Deadlock
public void c1c2Up() {
synchronized(lock1) {
c1++;
synchronized(lock2) {
c2++;
}
}
}
public void c2c1Up() {
synchronized(lock2) {
c2++;
synchronized(lock1) {
c1++;
}
}
}
19
Служба в отдельном потоке
20
private boolean needDoSomething;
G
public void run() {
while(true){
if(needDoSomething){
doSomething();
}
Thread.sleep(1000);
}
}
wait() and notify()
wait(), notify() и notifyAll() ― методы класса Object
object.wait() ― ждать в текущем потоке, пока не придет notify()
object.notify() ― сигнал «продолжить» первому кто начал wait()
object.notifyAll() ― сигнал «продолжить» всем кто начал wait()
Демонстрация работы кода RandomRunExample.example();
21
План лекции
22
1. Thread, Runnable=
2. Frontend и
Account Service=
3. Concurrent
Collections=
4. Message System
UserSession
23
UserSession содержит:
Каждому, кто пришел на сервер - UserSession
Каждой UserSession – sessionId (из HttpSession)
String sessionId
String userName
Long userId
На Frontend-е
Map<String, UserSession> sessionIdToSession;
В одном потоке
24
Назначаем Id для пользовательской сесcии
В методе handle() спрашиваем у AccountService userId по имени
Создаем объект Accounter, который будет скрывать авторизацию
Ждем пока AccountService прочитает эти данные из базы
Создаем на основе сесcии страницу и отдаем ее браузеру
Сохраняем в объекте сессии данные о пользователе
Спрашиваем у пользователя имя
Авторизация
Временная диаграмма
Авторизация
25
browser server
start on localhost:8080
http://localhost:8080/
generate sessionId
first access
enter your name
submit name
load userId
Hello user!
Frontend и Account Service
26
Frontend создает пользовательскую сессиюG
Frontend возвращает страницу созданную на основе сесcии в браузерG
Frontend запрашивает у Account Service данные по авторизацииG
Когда данные приходят, Frontend меняет состояние сессии
Разведем работу с пользователем и AccountService по разным потокамG
Frontend ― поток который работает с пользователямиG
AccountService ― поток который работает с авторизацией
Состояния
27
Ответ 2: sessionId + «Ждите авторизации»
Запрос 0: Первый запрос страницы.
Запрос 2: sessionId
Запрос 3: sessionId
Ответ 3: sessionId + «Ваше имя» + userName + « ваш Id: » + userId
Ответ 0: sessionId + «Введите имя»
Запрос 1: sessionId + Имя
Ответ 1: sessionId + «Ждите авторизации»
Запрос на
AccountServer
Ответ не пришел
Ответ пришел
Frontend и Account Service
Решение в 2 потока
28
frontend account service
get Id from Storage
get Id by name
return Id for name
Hello user!
submit name
wait for auth
check state
wait for auth
check state
План лекции
29
1. Thread, Runnable=
2. Frontend и
Account Service=
3. Concurrent
Collections=
4. Message System
Atomic
30
java.util.concurrent.atomic
AtomicBoolean
AtomicInteger
AtomicLong
Реализованы без использования synchronized
public final int incrementAndGet() {
while (true) {
int current = get(); //get() возвращает текущее значение (volatile)
int next = current + 1;
if (compareAndSet(current, next))
return next;
}
}
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
optimistic locking
Synchronized vs. Concurrent
31
Concurrent ― предназначена для работы с несколькими потоками,

но не синхронная (без использования synchronized)G
ConcurrentHashMap ― concurrent
java.util.Hashtable ― synchronized
synchronized ― гарантия, что только один поток работает с элементом
Concurrent ― разрешено одновременное чтение и безопасная запись
Concurrent Collections
32
CopyOnWriteArrayListG G копирование при вставке в ArrayList
CopyOnWriteArraySetG G Set интерфейс над CopyOnWriteArrayList
ConcurrentHashMapG G thread safe HashMap
ConcurrentSkipListMapGG ключи уникальны и отсортированы
ConcurrentSkipListSetG G set на базе ConcurrentSkipListMap
Контейнеры безопасные 

для многопоточного доступа
Очереди безопасные 

для многопоточного доступа
Concurrent Queues
33
BlockingQueueGG G G очередь с ограничениме размера
ConcurrentLinkedQueueG G G thread safe очередь
LinkedBlockingQueue
ArrayBlockingQueue
BlockingDequeG G G G двухсторонняя «очередь»
ArrayBlockingDeque
План лекции
34
1. Thread, Runnable=
2. Frontend и
Account Service=
3. Concurrent
Collections=
4. Message System
Thread-local объекты
Основная идея
Обмен сообщениями
35
Один поток кладет сообщение в коллекцию
Второй поток достает сообщение и исполняет его
Thread-Safe коллекции
Безопасная работа с элементами коллекции
Оптимальная работа
Объекты на которые есть ссылки только из одного потока
MessageSystem ― 

объект для обмена данными
Message System
36
Одна система сообщений на процесс
Единственный объект доступный из нескольких потоков
По одной очереди сообщений на поток
Каждый поток берет свою очередь из потока и выполняет
сообщения
Каждый поток имеет свой адрес
Из любого места потока можно положить сообщение в очередь по
адресу
Обмен сообщениями
37
Frontend
Account G
Service
Account G
Queue
Frontend G
Queue
MsgToAccountService MsgToFrontend
MessageSystem
Address и Abonent
38
public class Address {
static private AtomicInteger abonentIdCreator = new AtomicInteger();
final private int abonentId;
G
public Address(){
this.abonentId = abonentIdCreator.incrementAndGet();
}
G
public int hashCode() {
return abonentId;
}
}
public interface Abonent {
Address getAddress();
}
Message
39
public abstract class Msg {
final private Address from;
final private Address to;
G
public Msg(Address from, Address to){
this.from = from;
this.to = to;
}
G
protected Address getFrom(){
return from;
}
G
protected Address getTo(){
return to;
}
G
public abstract void exec(Abonent abonent);
}
Message to Account Service
40
public abstract class MsgToAS extends Msg{
G
public MsgToAS(Address from, Address to) {
super(from, to);
}
G
void exec(Abonent abonent) {
if(abonent instanceof AccountService){
exec((AccountService) abonent);
}
}
G
abstract void exec(AccountService accountService);
}
Message to Account Service
41
public class MsgGetUserId extends MsgToAS {
private String name;
private String sessionId;
public MsgGetUserId(Address from, Address to, String name, String
sessionId) {
super(from, to);
this.name= name;
this.sessionId = sessionId;
}
G
void exec(AccountService accountService) {
Long id = accountService.getUserId(name);
Msg back = new MsgUpdateUserId(getTo(), getFrom(), sessionId,
id);
accountService.getMessageSystem(). sendMessage(back);
}
}
Иерархия сообщений
42
Msg
MsgToAS MsgToFrontend
MsgUpdateUserIdMsgGetUserId
- Address from
- Address to
- String name
- Integer sessionId
- Integer sessionId
- Integer userId
Message System
43
private Map<Address, ConcurrentLinkedQueue<Msg>> messages
= new HashMap<Address,
ConcurrentLinkedQueue<Msg>>();
G
G
public void sendMessage(Msg message){
Queue<Msg> messageQueue = messages.get(message.getTo());
messageQueue.add(message);
}
G
public void execForAbonent(Abonent abonent) {
Queue<Msg> messageQueue = messages.get(abonent.getAddress());
while(!messageQueue.isEmpty()){
Msg message = messageQueue.poll();
message.exec(abonent);
}
}
MessageSystem ничего не знает о Frontend и AccountService
Все что нужно MessageSystem это Address, Abonent и Msg
Можно добавлять дополнительные сервисы
Абстракция
44
Address Service
45
Часть Message System которая знает адреса абонентов
Может вернуть адрес Account сервиса и Frontend
Производит балансировку, если сервисов несколько
Address Service
46
public class AddressService {
private Address accountService;
G
public Address getAccountService() {
return accountService;
}
G
public void setAccountService(Address accountService) {
this.accountService = accountService;
}
}
AddressService можно хранить в MessageSystemG
G
Address аккаунт сервера для пользователя можно хранить в UserSession
Обмен сообщениями
47
frontend account service
get Id from Storage
MsgGetUserId
MsgUpdateUserId
Hello user!
submit name
wait for auth
check state
wait for auth
check state
Метод run()
48
public void run() {
while (true) {
messageSystem.execForAbonent(this);
Thread.sleep(TICK_TIME);
}
}
Демонстрация кода
49
Переключаемся на код и смотрим как он работает
Спасибо за внимание
Виталий Чибриков
chibrikov@corp.mail.ru

Contenu connexe

Tendances

Протокол HTTP. Клиент-серверная модель взаимодействия. Servlet API
Протокол HTTP. Клиент-серверная модель взаимодействия. Servlet APIПротокол HTTP. Клиент-серверная модель взаимодействия. Servlet API
Протокол HTTP. Клиент-серверная модель взаимодействия. Servlet APIEkaterina Kuchinskaya
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.Igor Shkulipa
 
МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5Dima Dzuba
 
МАИ, Сети ЭВМ, Лекция №4
МАИ, Сети ЭВМ, Лекция №4МАИ, Сети ЭВМ, Лекция №4
МАИ, Сети ЭВМ, Лекция №4Dima Dzuba
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.Igor Shkulipa
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.Igor Shkulipa
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage CollectorOlexandra Dmytrenko
 
C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.Igor Shkulipa
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.Igor Shkulipa
 
Multithreading in java past and actual
Multithreading in java past and actualMultithreading in java past and actual
Multithreading in java past and actualYevgen Levik
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node jsAlex Tumanoff
 
C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.Igor Shkulipa
 
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
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.Igor Shkulipa
 
Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6Technopark
 
FreeRTOS
FreeRTOSFreeRTOS
FreeRTOSquakke
 
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)Ontico
 

Tendances (20)

Протокол HTTP. Клиент-серверная модель взаимодействия. Servlet API
Протокол HTTP. Клиент-серверная модель взаимодействия. Servlet APIПротокол HTTP. Клиент-серверная модель взаимодействия. Servlet API
Протокол HTTP. Клиент-серверная модель взаимодействия. Servlet API
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.
 
МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5
 
МАИ, Сети ЭВМ, Лекция №4
МАИ, Сети ЭВМ, Лекция №4МАИ, Сети ЭВМ, Лекция №4
МАИ, Сети ЭВМ, Лекция №4
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.
 
Thread
ThreadThread
Thread
 
Java 8. Thread pools
Java 8. Thread poolsJava 8. Thread pools
Java 8. Thread pools
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage Collector
 
C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.
 
Multithreading in java past and actual
Multithreading in java past and actualMultithreading in java past and actual
Multithreading in java past and actual
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node js
 
C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.
 
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
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
 
java
javajava
java
 
Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6
 
FreeRTOS
FreeRTOSFreeRTOS
FreeRTOS
 
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
 

En vedette

Бизнес весна 2014 лекция 3
Бизнес весна 2014 лекция 3Бизнес весна 2014 лекция 3
Бизнес весна 2014 лекция 3Technopark
 
Java осень 2012 лекция 4
Java осень 2012 лекция 4Java осень 2012 лекция 4
Java осень 2012 лекция 4Technopark
 
C++ осень 2012 лекция 3
C++ осень 2012 лекция 3C++ осень 2012 лекция 3
C++ осень 2012 лекция 3Technopark
 
Бизнес весна 2014 лекция 2
Бизнес весна 2014 лекция 2Бизнес весна 2014 лекция 2
Бизнес весна 2014 лекция 2Technopark
 
Разработка веб-сервисов осень 2013 лекция 12
Разработка веб-сервисов осень 2013 лекция 12Разработка веб-сервисов осень 2013 лекция 12
Разработка веб-сервисов осень 2013 лекция 12Technopark
 
Разработка веб-сервисов осень 2013 лекция 7
Разработка веб-сервисов осень 2013 лекция 7Разработка веб-сервисов осень 2013 лекция 7
Разработка веб-сервисов осень 2013 лекция 7Technopark
 
C++ осень 2013 лекция 1
C++ осень 2013 лекция 1C++ осень 2013 лекция 1
C++ осень 2013 лекция 1Technopark
 
углубленное программирование на C++. лекция no.5 [4.0]
углубленное программирование на C++. лекция no.5 [4.0]углубленное программирование на C++. лекция no.5 [4.0]
углубленное программирование на C++. лекция no.5 [4.0]Technopark
 
C++ весна 2014 лекция 2
C++ весна 2014 лекция 2C++ весна 2014 лекция 2
C++ весна 2014 лекция 2Technopark
 
Web осень 2012 лекция 2
Web осень 2012 лекция 2Web осень 2012 лекция 2
Web осень 2012 лекция 2Technopark
 
Тестирование лекция 2 весна 2014
Тестирование лекция 2 весна 2014Тестирование лекция 2 весна 2014
Тестирование лекция 2 весна 2014Technopark
 
Алгоритмы и структуры данных весна 2014 лекция 3
Алгоритмы и структуры данных весна 2014 лекция 3Алгоритмы и структуры данных весна 2014 лекция 3
Алгоритмы и структуры данных весна 2014 лекция 3Technopark
 
HighLoad весна 2014 лекция 5
HighLoad весна 2014 лекция 5HighLoad весна 2014 лекция 5
HighLoad весна 2014 лекция 5Technopark
 
Проектирование интерфейсов весна 2014 занятие 7
Проектирование интерфейсов весна 2014 занятие 7Проектирование интерфейсов весна 2014 занятие 7
Проектирование интерфейсов весна 2014 занятие 7Technopark
 
Бизнес весна 2014 лекция 6
Бизнес весна 2014 лекция 6Бизнес весна 2014 лекция 6
Бизнес весна 2014 лекция 6Technopark
 
Тестирование весна 2014 смешанное занятие 3
Тестирование весна 2014 смешанное занятие 3Тестирование весна 2014 смешанное занятие 3
Тестирование весна 2014 смешанное занятие 3Technopark
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...Technopark
 
Бизнес весна 2014 лекция 4
Бизнес весна 2014 лекция 4Бизнес весна 2014 лекция 4
Бизнес весна 2014 лекция 4Technopark
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"Technopark
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"Technopark
 

En vedette (20)

Бизнес весна 2014 лекция 3
Бизнес весна 2014 лекция 3Бизнес весна 2014 лекция 3
Бизнес весна 2014 лекция 3
 
Java осень 2012 лекция 4
Java осень 2012 лекция 4Java осень 2012 лекция 4
Java осень 2012 лекция 4
 
C++ осень 2012 лекция 3
C++ осень 2012 лекция 3C++ осень 2012 лекция 3
C++ осень 2012 лекция 3
 
Бизнес весна 2014 лекция 2
Бизнес весна 2014 лекция 2Бизнес весна 2014 лекция 2
Бизнес весна 2014 лекция 2
 
Разработка веб-сервисов осень 2013 лекция 12
Разработка веб-сервисов осень 2013 лекция 12Разработка веб-сервисов осень 2013 лекция 12
Разработка веб-сервисов осень 2013 лекция 12
 
Разработка веб-сервисов осень 2013 лекция 7
Разработка веб-сервисов осень 2013 лекция 7Разработка веб-сервисов осень 2013 лекция 7
Разработка веб-сервисов осень 2013 лекция 7
 
C++ осень 2013 лекция 1
C++ осень 2013 лекция 1C++ осень 2013 лекция 1
C++ осень 2013 лекция 1
 
углубленное программирование на C++. лекция no.5 [4.0]
углубленное программирование на C++. лекция no.5 [4.0]углубленное программирование на C++. лекция no.5 [4.0]
углубленное программирование на C++. лекция no.5 [4.0]
 
C++ весна 2014 лекция 2
C++ весна 2014 лекция 2C++ весна 2014 лекция 2
C++ весна 2014 лекция 2
 
Web осень 2012 лекция 2
Web осень 2012 лекция 2Web осень 2012 лекция 2
Web осень 2012 лекция 2
 
Тестирование лекция 2 весна 2014
Тестирование лекция 2 весна 2014Тестирование лекция 2 весна 2014
Тестирование лекция 2 весна 2014
 
Алгоритмы и структуры данных весна 2014 лекция 3
Алгоритмы и структуры данных весна 2014 лекция 3Алгоритмы и структуры данных весна 2014 лекция 3
Алгоритмы и структуры данных весна 2014 лекция 3
 
HighLoad весна 2014 лекция 5
HighLoad весна 2014 лекция 5HighLoad весна 2014 лекция 5
HighLoad весна 2014 лекция 5
 
Проектирование интерфейсов весна 2014 занятие 7
Проектирование интерфейсов весна 2014 занятие 7Проектирование интерфейсов весна 2014 занятие 7
Проектирование интерфейсов весна 2014 занятие 7
 
Бизнес весна 2014 лекция 6
Бизнес весна 2014 лекция 6Бизнес весна 2014 лекция 6
Бизнес весна 2014 лекция 6
 
Тестирование весна 2014 смешанное занятие 3
Тестирование весна 2014 смешанное занятие 3Тестирование весна 2014 смешанное занятие 3
Тестирование весна 2014 смешанное занятие 3
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
 
Бизнес весна 2014 лекция 4
Бизнес весна 2014 лекция 4Бизнес весна 2014 лекция 4
Бизнес весна 2014 лекция 4
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
 

Similaire à Java весна 2014 лекция 5

8. java lecture threads
8. java lecture threads8. java lecture threads
8. java lecture threadsMERA_school
 
Java осень 2013 лекция 3
Java осень 2013 лекция 3Java осень 2013 лекция 3
Java осень 2013 лекция 3Technopark
 
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Noveo
 
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.
 
Android - 11 - Multithreading
Android - 11 - MultithreadingAndroid - 11 - Multithreading
Android - 11 - MultithreadingNoveo
 
C# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущееC# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущееGetDev.NET
 
Atomics, CAS and Nonblocking algorithms
Atomics, CAS and Nonblocking algorithmsAtomics, CAS and Nonblocking algorithms
Atomics, CAS and Nonblocking algorithmsAlexey Fyodorov
 
Java осень 2013 лекция 6
Java осень 2013 лекция 6Java осень 2013 лекция 6
Java осень 2013 лекция 6Technopark
 
Lecture1: Introduction to Parallel Computing
Lecture1: Introduction to  Parallel ComputingLecture1: Introduction to  Parallel Computing
Lecture1: Introduction to Parallel ComputingAndrii Rodionov
 
Android осень 2013 лекция 3
Android осень 2013 лекция 3Android осень 2013 лекция 3
Android осень 2013 лекция 3Technopark
 
Многопоточное программирование на C#, путевые заметки
Многопоточное программирование на C#, путевые заметкиМногопоточное программирование на C#, путевые заметки
Многопоточное программирование на C#, путевые заметкиDotNetConf
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Anton Moiseenko
 
Киллер-фича языка C# — конструкция async/await
Киллер-фича языка C# — конструкция async/awaitКиллер-фича языка C# — конструкция async/await
Киллер-фича языка C# — конструкция async/awaitByndyusoft
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5Technopark
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммыPlatonov Sergey
 
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
 

Similaire à Java весна 2014 лекция 5 (20)

8. java lecture threads
8. java lecture threads8. java lecture threads
8. java lecture threads
 
Java осень 2013 лекция 3
Java осень 2013 лекция 3Java осень 2013 лекция 3
Java осень 2013 лекция 3
 
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
 
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
 
Android - 11 - Multithreading
Android - 11 - MultithreadingAndroid - 11 - Multithreading
Android - 11 - Multithreading
 
Working with .NET Threads
Working with .NET ThreadsWorking with .NET Threads
Working with .NET Threads
 
C# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущееC# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущее
 
Atomics, CAS and Nonblocking algorithms
Atomics, CAS and Nonblocking algorithmsAtomics, CAS and Nonblocking algorithms
Atomics, CAS and Nonblocking algorithms
 
Java осень 2013 лекция 6
Java осень 2013 лекция 6Java осень 2013 лекция 6
Java осень 2013 лекция 6
 
Lecture1: Introduction to Parallel Computing
Lecture1: Introduction to  Parallel ComputingLecture1: Introduction to  Parallel Computing
Lecture1: Introduction to Parallel Computing
 
Android осень 2013 лекция 3
Android осень 2013 лекция 3Android осень 2013 лекция 3
Android осень 2013 лекция 3
 
Step 7
Step 7Step 7
Step 7
 
Многопоточное программирование на C#, путевые заметки
Многопоточное программирование на C#, путевые заметкиМногопоточное программирование на C#, путевые заметки
Многопоточное программирование на C#, путевые заметки
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.
 
Киллер-фича языка C# — конструкция async/await
Киллер-фича языка C# — конструкция async/awaitКиллер-фича языка C# — конструкция async/await
Киллер-фича языка C# — конструкция async/await
 
Async
AsyncAsync
Async
 
Luxoft async.net
Luxoft async.netLuxoft async.net
Luxoft async.net
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
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.
 

Plus de Technopark

Лекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelЛекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelTechnopark
 
Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuЛекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuTechnopark
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARNTechnopark
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. SparkTechnopark
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache MahoutTechnopark
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeperTechnopark
 
Лекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveЛекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveTechnopark
 
Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Technopark
 
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)Technopark
 
Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Technopark
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSTechnopark
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы HadoopTechnopark
 
Лекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceЛекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceTechnopark
 
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"Technopark
 
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"Technopark
 
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"Technopark
 
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...Technopark
 
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...Technopark
 
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"Technopark
 
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"Technopark
 

Plus de Technopark (20)

Лекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelЛекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель Pregel
 
Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuЛекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.Ru
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARN
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. Spark
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache Mahout
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeper
 
Лекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveЛекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и Hive
 
Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)
 
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)
 
Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFS
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы Hadoop
 
Лекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceЛекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduce
 
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"
 
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
 
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"
 
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
 
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
 
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
 
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
 

Java весна 2014 лекция 5

  • 2. План лекции 2 1. Thread, Runnable= 2. Frontend и Account Service= 3. Concurrent Collections= 4. Message System
  • 3. Processes and Threads 3 Процессы Приложение со своим набором run-time ресурсов и собственной памятью Взаимодействие через Inter Process Communication ресурсы Можно запускать на нескольких компьютерах Потоки «Живут» в одном процессе Старт приложения – создание main потока Используют общую память (heap) и другие ресурсы приложения Потоки могут порождать другие потоки и взаимодействовать с ними
  • 4. Что такое поток? 4 Поток Объект, у класса которого есть методы start() и run() После вызова метода start() будет выполнен run() Метод run() будет выполнен в своем стеке
  • 7. Роль операционной системы 7 Операционная система Создает потоки Переключает потоки Следит за мониторами
  • 8. interface Runnable 8 Всего один метод – run() Runnable Поток это объект, реазизующий интерфейс Runnable public class HelloRunnable implements Runnable { G public void run() { System.out.println("Hello from a thread!"); } public static void main(String args[]) { (new Thread(new HelloRunnable())).start(); } }
  • 9. class Thread 9 class MyThread extends Thread Thread содержит метод start() ― запуск нового потока сlass Thread реализует интерфейс Runnable public class HelloThread extends Thread { public void run() { System.out.println("Hello from a thread!"); } G public static void main(String args[]) { (new HelloThread()).start(); } }
  • 10. Runnable Runnable vs Thread 10 Runnable класс нужно передавать в конструктор Thread объекта Можно наследовать класс отличный от Thread Thread Содержит методы управления потоком Thread thread = Thread.currentThread(); Текущий Thread object можно получить в любом месте кода
  • 11. Доступ к объекту потока Текущий Thread object можно получить в любом месте кода long getId() String getName() int getPriority() void setPriority(int priority) static void sleep(long ms) void interrupt() static boolean interrupted() void join() 11 Thread thread = Thread.currentThread(); Некоторые методы
  • 12. sleep and interrupt Если нужно остановить выполнение потока Thread.sleep(1000) – остановит выполнение потока на 1 секунду Если нужно прервать выполнение потока thread.interrupt() – пошлет прерывание потоку thread try { Thread.sleep(5000); } catch (InterruptedException e) { // We've been interrupted. return; } G for (int i = 0; i < inputs.length; i++) { heavyTask(inputs[i]); if (Thread.interrupted()) { // We've been interrupted. return; } } 12
  • 13. Если надо остановить текущий поток до окончания другого потока join 13 Текущий поток ждет пока завершиться поток thread В текущем потоке вызываем thread.join(). public class HelloThread extends Thread { public void run() { System.out.println(“1. Hello from a thread!"); } public static void main(String args[]) { Thread thread = new HelloThread(); thread.start(); thread.join(); System.out.println(“2. Hello from the main!"); } }
  • 14. Взаимодействие потоков У потоков общий Heap Можно передать в два потока ссылку на один объект Потоки смогут менять общий объект и взаимодействовать через него 14 Как осуществить взаимодействие между потоками?
  • 15. Java memory model Memory model + volatile 15 volatile – не кэшировать, всегда считывать из общей памяти Описывает то, как потоки должны взаимодействовать через общую память Кэширование значений в многопроцессорных средах Изменение порядка операций для оптимизации Основные проблемы final – не изменять значение переменной synchronized – отметить участок кода доступный только одному треду Инструменты для решения
  • 16. Synchronization Демонстрация работы кода ThreadInterference.example(); Возможные ошибки одновременного доступа Thread Interference – потеря результата Memory Consistency Errors – ошибочное состояние общей памяти 16
  • 17. Synchronization public synchronized void increment() { ++i; } public void addName(String name) { synchronized(lockObject) { lastName = name; nameCount++; } nameList.add(name); } 17 Synchronized methods Synchronized statements
  • 18. Lock object (mutex) public class TwoLocks { private long c1 = 0; private long c2 = 0; private Object lock1 = new Object(); //the first lock private Object lock2 = new Object(); //the second lock public void c1Up() { synchronized(lock1) { c1++; } } G public void c2Up() { synchronized(lock2) { c2++; } } } 18
  • 19. Deadlock public void c1c2Up() { synchronized(lock1) { c1++; synchronized(lock2) { c2++; } } } public void c2c1Up() { synchronized(lock2) { c2++; synchronized(lock1) { c1++; } } } 19
  • 20. Служба в отдельном потоке 20 private boolean needDoSomething; G public void run() { while(true){ if(needDoSomething){ doSomething(); } Thread.sleep(1000); } }
  • 21. wait() and notify() wait(), notify() и notifyAll() ― методы класса Object object.wait() ― ждать в текущем потоке, пока не придет notify() object.notify() ― сигнал «продолжить» первому кто начал wait() object.notifyAll() ― сигнал «продолжить» всем кто начал wait() Демонстрация работы кода RandomRunExample.example(); 21
  • 22. План лекции 22 1. Thread, Runnable= 2. Frontend и Account Service= 3. Concurrent Collections= 4. Message System
  • 23. UserSession 23 UserSession содержит: Каждому, кто пришел на сервер - UserSession Каждой UserSession – sessionId (из HttpSession) String sessionId String userName Long userId На Frontend-е Map<String, UserSession> sessionIdToSession;
  • 24. В одном потоке 24 Назначаем Id для пользовательской сесcии В методе handle() спрашиваем у AccountService userId по имени Создаем объект Accounter, который будет скрывать авторизацию Ждем пока AccountService прочитает эти данные из базы Создаем на основе сесcии страницу и отдаем ее браузеру Сохраняем в объекте сессии данные о пользователе Спрашиваем у пользователя имя Авторизация
  • 25. Временная диаграмма Авторизация 25 browser server start on localhost:8080 http://localhost:8080/ generate sessionId first access enter your name submit name load userId Hello user!
  • 26. Frontend и Account Service 26 Frontend создает пользовательскую сессиюG Frontend возвращает страницу созданную на основе сесcии в браузерG Frontend запрашивает у Account Service данные по авторизацииG Когда данные приходят, Frontend меняет состояние сессии Разведем работу с пользователем и AccountService по разным потокамG Frontend ― поток который работает с пользователямиG AccountService ― поток который работает с авторизацией
  • 27. Состояния 27 Ответ 2: sessionId + «Ждите авторизации» Запрос 0: Первый запрос страницы. Запрос 2: sessionId Запрос 3: sessionId Ответ 3: sessionId + «Ваше имя» + userName + « ваш Id: » + userId Ответ 0: sessionId + «Введите имя» Запрос 1: sessionId + Имя Ответ 1: sessionId + «Ждите авторизации» Запрос на AccountServer Ответ не пришел Ответ пришел
  • 28. Frontend и Account Service Решение в 2 потока 28 frontend account service get Id from Storage get Id by name return Id for name Hello user! submit name wait for auth check state wait for auth check state
  • 29. План лекции 29 1. Thread, Runnable= 2. Frontend и Account Service= 3. Concurrent Collections= 4. Message System
  • 30. Atomic 30 java.util.concurrent.atomic AtomicBoolean AtomicInteger AtomicLong Реализованы без использования synchronized public final int incrementAndGet() { while (true) { int current = get(); //get() возвращает текущее значение (volatile) int next = current + 1; if (compareAndSet(current, next)) return next; } } public final boolean compareAndSet(int expect, int update) { return unsafe.compareAndSwapInt(this, valueOffset, expect, update); } optimistic locking
  • 31. Synchronized vs. Concurrent 31 Concurrent ― предназначена для работы с несколькими потоками,
 но не синхронная (без использования synchronized)G ConcurrentHashMap ― concurrent java.util.Hashtable ― synchronized synchronized ― гарантия, что только один поток работает с элементом Concurrent ― разрешено одновременное чтение и безопасная запись
  • 32. Concurrent Collections 32 CopyOnWriteArrayListG G копирование при вставке в ArrayList CopyOnWriteArraySetG G Set интерфейс над CopyOnWriteArrayList ConcurrentHashMapG G thread safe HashMap ConcurrentSkipListMapGG ключи уникальны и отсортированы ConcurrentSkipListSetG G set на базе ConcurrentSkipListMap Контейнеры безопасные 
 для многопоточного доступа
  • 33. Очереди безопасные 
 для многопоточного доступа Concurrent Queues 33 BlockingQueueGG G G очередь с ограничениме размера ConcurrentLinkedQueueG G G thread safe очередь LinkedBlockingQueue ArrayBlockingQueue BlockingDequeG G G G двухсторонняя «очередь» ArrayBlockingDeque
  • 34. План лекции 34 1. Thread, Runnable= 2. Frontend и Account Service= 3. Concurrent Collections= 4. Message System
  • 35. Thread-local объекты Основная идея Обмен сообщениями 35 Один поток кладет сообщение в коллекцию Второй поток достает сообщение и исполняет его Thread-Safe коллекции Безопасная работа с элементами коллекции Оптимальная работа Объекты на которые есть ссылки только из одного потока
  • 36. MessageSystem ― 
 объект для обмена данными Message System 36 Одна система сообщений на процесс Единственный объект доступный из нескольких потоков По одной очереди сообщений на поток Каждый поток берет свою очередь из потока и выполняет сообщения Каждый поток имеет свой адрес Из любого места потока можно положить сообщение в очередь по адресу
  • 37. Обмен сообщениями 37 Frontend Account G Service Account G Queue Frontend G Queue MsgToAccountService MsgToFrontend MessageSystem
  • 38. Address и Abonent 38 public class Address { static private AtomicInteger abonentIdCreator = new AtomicInteger(); final private int abonentId; G public Address(){ this.abonentId = abonentIdCreator.incrementAndGet(); } G public int hashCode() { return abonentId; } } public interface Abonent { Address getAddress(); }
  • 39. Message 39 public abstract class Msg { final private Address from; final private Address to; G public Msg(Address from, Address to){ this.from = from; this.to = to; } G protected Address getFrom(){ return from; } G protected Address getTo(){ return to; } G public abstract void exec(Abonent abonent); }
  • 40. Message to Account Service 40 public abstract class MsgToAS extends Msg{ G public MsgToAS(Address from, Address to) { super(from, to); } G void exec(Abonent abonent) { if(abonent instanceof AccountService){ exec((AccountService) abonent); } } G abstract void exec(AccountService accountService); }
  • 41. Message to Account Service 41 public class MsgGetUserId extends MsgToAS { private String name; private String sessionId; public MsgGetUserId(Address from, Address to, String name, String sessionId) { super(from, to); this.name= name; this.sessionId = sessionId; } G void exec(AccountService accountService) { Long id = accountService.getUserId(name); Msg back = new MsgUpdateUserId(getTo(), getFrom(), sessionId, id); accountService.getMessageSystem(). sendMessage(back); } }
  • 42. Иерархия сообщений 42 Msg MsgToAS MsgToFrontend MsgUpdateUserIdMsgGetUserId - Address from - Address to - String name - Integer sessionId - Integer sessionId - Integer userId
  • 43. Message System 43 private Map<Address, ConcurrentLinkedQueue<Msg>> messages = new HashMap<Address, ConcurrentLinkedQueue<Msg>>(); G G public void sendMessage(Msg message){ Queue<Msg> messageQueue = messages.get(message.getTo()); messageQueue.add(message); } G public void execForAbonent(Abonent abonent) { Queue<Msg> messageQueue = messages.get(abonent.getAddress()); while(!messageQueue.isEmpty()){ Msg message = messageQueue.poll(); message.exec(abonent); } }
  • 44. MessageSystem ничего не знает о Frontend и AccountService Все что нужно MessageSystem это Address, Abonent и Msg Можно добавлять дополнительные сервисы Абстракция 44
  • 45. Address Service 45 Часть Message System которая знает адреса абонентов Может вернуть адрес Account сервиса и Frontend Производит балансировку, если сервисов несколько
  • 46. Address Service 46 public class AddressService { private Address accountService; G public Address getAccountService() { return accountService; } G public void setAccountService(Address accountService) { this.accountService = accountService; } } AddressService можно хранить в MessageSystemG G Address аккаунт сервера для пользователя можно хранить в UserSession
  • 47. Обмен сообщениями 47 frontend account service get Id from Storage MsgGetUserId MsgUpdateUserId Hello user! submit name wait for auth check state wait for auth check state
  • 48. Метод run() 48 public void run() { while (true) { messageSystem.execForAbonent(this); Thread.sleep(TICK_TIME); } }
  • 49. Демонстрация кода 49 Переключаемся на код и смотрим как он работает
  • 50. Спасибо за внимание Виталий Чибриков chibrikov@corp.mail.ru