Лекция для сотрудников фирмы Soft-logic, проведенная 25.12.2014. В ходе лекции рассматривались следующие ключевые моменты:
1. Постановка проблемы. Паттерн пул потоков
- Проблема производительности
- Описание паттерна в общем виде
- Основные два подхода к запуску задач
- Три стратегии организации пулов потоков
2. Интерфейсы и классы взаимодействия с пулами потоков
- Интерфейсы ExecutorService, ScheduledExecutorService
- Реализации ThreadPoolExecutor, ScheduledThreadPoolExecutor
- Интерфейсы Runnable, Callable<v>,Future<v>, RunnableFuture<v>
3. Фабрика пулов Executors
- CachedThreadPool
- SingleThreadExecutor
- FixedThreadPool
- ThreadScheduledExecutor
- WorkStealingPool
4. Классы задач
- ForkJoinTask, RecursiveTask, RecursiveAction
- CompletableFuture<v>
5. ForkJoinPool
- Особенности производительности
- Общий пул ява машины
В презентации рассказывается о структурах памяти в JVM: Heap, Non-Heap, Stack, об атомарности операций и о garbage collector. Рассмотрен пример, как работает стек. Также, приведены примеры, как использовать jVisualVM и что она может показать.
Multithreading in java past and actualYevgen Levik
In this talk I’d like to give you an overview of java.util.concurrent package and represent useful Java concurrency tools. I’ll cover the core functionality and the state-of-the-art API (Executors, Accumulators, StampedLock etc).
Simple examples in github (https://github.com/levik666/OverviewInJavaUtilConcurrent)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)Ontico
«Одноклассники» состоят из тысяч серверов, большая часть которых участвует в онлайн-обработке запросов пользователей. Каждый из этих серверов владеет только частью данных или логики. Эти части в социальной сети изолировать друг от друга невозможно, поэтому между серверами происходит много сетевого взаимодействия — разнообразного и большого по объему. Таким образом, Одноклассники — это одна из самых больших, сложных и нагруженных распределенных систем в мире.
В этом докладе Олег расскажет об опыте построения отказоустойчивых распределенных систем на Java, основных ошибках и отказах, приемах их тестирования и диагностики. Также речь пойдет об авариях в распределенных системах и методах их предупреждения.
Лекция для сотрудников фирмы Soft-logic, проведенная 25.12.2014. В ходе лекции рассматривались следующие ключевые моменты:
1. Постановка проблемы. Паттерн пул потоков
- Проблема производительности
- Описание паттерна в общем виде
- Основные два подхода к запуску задач
- Три стратегии организации пулов потоков
2. Интерфейсы и классы взаимодействия с пулами потоков
- Интерфейсы ExecutorService, ScheduledExecutorService
- Реализации ThreadPoolExecutor, ScheduledThreadPoolExecutor
- Интерфейсы Runnable, Callable<v>,Future<v>, RunnableFuture<v>
3. Фабрика пулов Executors
- CachedThreadPool
- SingleThreadExecutor
- FixedThreadPool
- ThreadScheduledExecutor
- WorkStealingPool
4. Классы задач
- ForkJoinTask, RecursiveTask, RecursiveAction
- CompletableFuture<v>
5. ForkJoinPool
- Особенности производительности
- Общий пул ява машины
В презентации рассказывается о структурах памяти в JVM: Heap, Non-Heap, Stack, об атомарности операций и о garbage collector. Рассмотрен пример, как работает стек. Также, приведены примеры, как использовать jVisualVM и что она может показать.
Multithreading in java past and actualYevgen Levik
In this talk I’d like to give you an overview of java.util.concurrent package and represent useful Java concurrency tools. I’ll cover the core functionality and the state-of-the-art API (Executors, Accumulators, StampedLock etc).
Simple examples in github (https://github.com/levik666/OverviewInJavaUtilConcurrent)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)Ontico
«Одноклассники» состоят из тысяч серверов, большая часть которых участвует в онлайн-обработке запросов пользователей. Каждый из этих серверов владеет только частью данных или логики. Эти части в социальной сети изолировать друг от друга невозможно, поэтому между серверами происходит много сетевого взаимодействия — разнообразного и большого по объему. Таким образом, Одноклассники — это одна из самых больших, сложных и нагруженных распределенных систем в мире.
В этом докладе Олег расскажет об опыте построения отказоустойчивых распределенных систем на Java, основных ошибках и отказах, приемах их тестирования и диагностики. Также речь пойдет об авариях в распределенных системах и методах их предупреждения.
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №10 "Нереляционное решение в области баз данных — NoSQL". Лектор - Станислав Ступников.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №7 "Оптимизация запросов и индексирование". Лектор - Павел Щербинин.
Вначале рассказывается об оптимизации доступа к данным, о декомпозиции соединения и состоянии запроса. Далее идёт большой блок, посвящённый оптимизатору запросов (изменение порядка соединения, применение алгебраических правил эквивалентности, оптимизации COUNT(), MIN(), MAX(), вычисление и свертка константных выражений, покрывающие индексы, оптимизация подзапросов, раннее завершение, сравнение по списку IN() и распространение равенства). Затем последовательно рассматриваются такие вещи, как соединение (JOIN) в MySQL, оптимизатор сортировки, коррелированные подзапросы, слияние и непоследовательный просмотр индексов, функции SELECT & UPDATE, COUNT(). После этого рассказывается об оптимизации запросов с помощью JOIN, GROUP BY, DISTINCT и LIMIT со смещением. В конце лекции даётся информация о кэшировании запросов, объединённых таблицах и секционировании.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №10 "Нереляционное решение в области баз данных — NoSQL". Лектор - Станислав Ступников.
Вводная часть посвящена определению и истории развития концепции NoSQL. Даются характеристики, рассказывается о способах использования. Рассматриваются виды NoSQL БД, теоретические основы NoSQL, а в конце лекции обсуждаются недостатки NoSQL-решений, а также проводится сравнение разных NoSQL-решений.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
Презентация к докладу - работа с потоками в .net
* Основе работы с потоками
* Средства блокирующей синхронизации
* Неблокирующая синхронизация
* Асинхронная модель программирования
* Пул потоков
* Класс BackGroundWorker
* Задачи
* Модель поставщик-потребитель
* Блокировка с двойной проверкой
В первой лекции рассматриваются основные виды параллелизма и способы написания высокопроизводительных приложений.
В конце рассматривается поддержка параллелизма в Java.
The 5-th lecture from the course "Java Core".
The Department of Information and Network Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
Как показывает практика, повсеместное применение классического, основанного на callback’ах подхода к асинхронному программированию обычно оказывается неудобным. Для упрощения написания и поддержки сложного асинхронного кода можно использовать иной подход — с использованием сопрограмм. Он значительно сокращает объём и сложность кода, превращая код из асинхронного в синхронный.
The 3rd part of the 3rd lecture from the course "Java Core".
The Department of Information and Network Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Лекция 5. MapReduce в Hadoop (алгоритмы)Technopark
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Лекция 3. Распределённая файловая система HDFSTechnopark
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Лекция 1. Введение в Big Data и MapReduceTechnopark
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №9 "Безопасность баз данных". Лектор - Павел Щербинин.
Открывается лекция рассказом о резервном копировании (о логических и физических резервных копиях, о выборе данных для копирования). Затем определяется терминология для обсуждения дальнейших вопросов. После этого рассматриваются основы учётных записей: таблицы доступа, привилегии, виды записей. Обсуждаются SQL-injection, список смежных вершин (Adjacency Set), вложенное множество (Nested Set), материализованный путь (Materialized Path) и комбинированный подход.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
СУБД 2013 Лекция №8 "Конфигурирование базы данных"Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №8 "Конфигурирование базы данных". Лектор - Павел Щербинин.
Сначала объясняются основы конфигурирования и общие принципы настройки. Далее рассказывается об области видимости, о настройке использования памяти, обсуждается размер блока ключей key_cache_block_size. Рассматривается устройство и использование кэша InnoDB, а также кэшей потоков и таблиц. Затем говорится об особенностях ввода/вывода в InnoDB. Далее рассказывается о табличном пространстве, оптимизации файловой сортировки, переменных состояния. Финальная часть лекции посвящена репликации: настройка, синхронизация, топология, планирование пропускной способности, администрирование и обслуживание, проблемы и их решения.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №5 "Определение узких мест". Лектор - Павел Щербинин.
Вначале рассказывается о подсистемах хранения: MyISAM, InnoDB, Memory, о критериях выбора подсистем хранения, приводятся практические примеры. Затем обсуждается тема индексирования (B-tree, хеш-индексы) и EXPLAIN (столбцы id, table, possible_keys, key, key_len).
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-запросы". Лектор - Павел Щербинин.
Лекция открывается рассказом о том, что такое профилирование запроса, каковы его этапы выполнения в MySQL. Рассказывается о том, как планировать запрос, как осуществляется протоколирование запросов, как собирается статистика. Объясняются основы индексирования, подробно обсуждаются стратегии индексирования для достижения высокой производительности: изоляция столбца, кластерные индексы (преимущества и недостатки), размещение данных в MyISAM и InnoDB, покрывающие индексы. Далее затрагивается тема нормализации и денормализации, а также таблиц счётчиков. В завершении рассказывается о версионировании схемы БД: о методах инкрементных изменений, идемпотентных изменений, уподобления структуры БД исходному коду.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных". Лекция №4 "Расширенные возможности работы с базами данных. Триггеры и хранимые процедуры"
Лектор - Павел Щербинин.
Первая часть лекции посвящена хранимым процедурам (использование, примеры кода, аспекты безопасности при использовании хранимых процедур): LOOP, REPEAT, WHILE, HANDLER, курсоры, EXECUTE. Во второй части рассказывается о триггерах: BEFORE, AFTER, INSTEAD OF, о специальных таблицах inserted, updated и deleted, об использовании триггеров для поддержания целостности и бизнес-логики, о проблемах при использовании триггеров, приводятся примеры кода. В завершающей части лекции обсуждаются вопросы, связанные с транзакциями: концепция A.C.I.D.; уровни изоляции ANSI/ISO (SET TRANSACTION ISOLATION LEVEL); взаимовлияние транзакций и проблемы lost update, dirty read, non-repeatable read и phantom read; технология MVCC (контроль версионирования конкуренции); конкуренция; параллельность и согласованность.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных". Лекция №3 "Выборка данных (продолжение). Транзакции"
Лектор - Павел Щербинин.
Лекция начинается с рассказа о добавлении данных и операторе INSERT, о модификации данных и операторе UPDATE, об удалении данных и операторе DELETE. Затем небольшая часть лекции посвящена пользовательским переменным. После этого даётся информация о подзапросах: SUBQUERIES, ROW SUBQUERIES, SUBQUERIES in FROM. Далее говорится об агрегации (UNION), о семействе функций JOIN и соединении таблиц, а в завершение лекции — о понятии VIEW (каковы преимущества, ограничения и особенности, алгоритмы использования и изменение).
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных". Лекция №2 "Модификация данных. Выборка данных (начало)"
Лектор - Павел Щербинин.
Сначала завершается рассмотрение типа данных MySQL «Дата и время». Затем рассказывается о создании таблиц (CREATE TABLE): create_definition, column_definition, reference_defenition, обновление кортежа в родительском отношении. Далее обсуждается процедура изменения таблицы (ALTER TABLE), выборка данных и оператор SELECT, а также фильтрация (формирование групп, агрегаторы).
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
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() будет выполнен в своем стеке
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
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ии страницу и отдаем ее браузеру
Сохраняем в объекте сессии данные о пользователе
Спрашиваем у пользователя имя
Авторизация
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
Одна система сообщений на процесс
Единственный объект доступный из нескольких потоков
По одной очереди сообщений на поток
Каждый поток берет свою очередь из потока и выполняет
сообщения
Каждый поток имеет свой адрес
Из любого места потока можно положить сообщение в очередь по
адресу
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);
}
}
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);
}
}