SlideShare uma empresa Scribd logo
1 de 69
Baixar para ler offline
Алексей Федоров,
Одноклассники / JUG.ru
Синхронизация без блокировок и СМС
@ #devclub
Кто вы?
Зачем вы здесь?
4
5
Модели
• Модель	с	разделяемой	памятью
- Регистры
- Операции:	read,	write
- Удобно	программировать,	все	привыкли
• Модель	с	передачей	сообщений
- Послать	сообщение
- Похожа	на	то,	как	реально	работает	железо
6
Терминология
• Нет	устоявшейся	терминологии
• Термины:
• Parallel
- Concurrent
- Distributed
7
Виды параллелизма
• На	уровне	операционной	системы
• На	уровне	одной	программы	/	процесса
8
Параллелизм — ОС
• Слушать	музыку	и	переписываться	в	фейсбуке
в	Одноклассниках
• При	зависании	одной	программы	другие	
продолжают	работать
• и	т.п.
9
Преимущества параллелизма
• Использование	нескольких	ядер/процессоров
- Да	и	на	1	ядре	тоже!	(async I/O)
• Простота	моделирования
- Абстракция:	фреймворк забирает	сложность
10
Преимущества параллелизма
• Использование	нескольких	ядер/процессоров
- Да	и	на	1	ядре	тоже!	(async I/O)
• Простота	моделирования
- Абстракция:	фреймворк забирает	сложность
• Упрощенная	обработка	асинхронных	событий
• Более	отзывчивые	интерфейсы	пользователя
- Event	Dispatch	Thread	(EDT),	async calls
11
Параллелизм на уровне
отдельно взятой программы
• Эффективное	использование	ресурсов
• Удобство,	простота	написания	кода
• Справедливость	
- Обработка	запросов	пользователей	на	серверах	
социальной	сети	с	одинаковым	приоритетом
- Читатели	и	писатели
- Fairness	(честность)
12
Lock lock = new ReentrantLock(true);
13
Честность!
Lock lock = new ReentrantLock(true);
14
Блокировки
• java.util.concurrent — since Java 5
- Lock —> ReentrantLock
- ReadWriteLock —> ReentrantReadWriteLock
- StampedLock — since Java 8
• Synchronized method / section
• wait() / notify() / notifyAll()
15
Блокировки
• java.util.concurrent — since Java 5
- Lock —> ReentrantLock
- ReadWriteLock —> ReentrantReadWriteLock
- StampedLock — since Java 8
• Synchronized method / section
• wait() / notify() / notifyAll()
Общее: ожидание
16
Проблемы блокировок
• Взаимоблокировки	(Deadlocks)
• Инверсия	приоритетов
• Надежность	— вдруг	владелец	блокировки	
помрет?
• Performance
- Параллелизма	в	критической	секции	нет!
- Владелец	блокировки	может	быть	вытеснен	
планировщиком
17
Закон Амдала
• α — часть	общего	объема	вычислений,	
которую	нельзя	распараллелить	
• 1-α — часть,	которую	можно	
распараллелить
• p — количество	потоков
18
Закон Амдала
• α — часть	общего	объема	вычислений,	
которую	нельзя	распараллелить	
• 1-α — часть,	которую	можно	
распараллелить
• p — количество	потоков
Неблокирующие алгоритмы
20
Классификация
• Без	препятствий	(Obstruction-Free)	— поток	
совершает	прогресс,	если	не	встречает	препятствий	
со	стороны	других	потоков
21
Классификация
• Без	препятствий	(Obstruction-Free)	— поток	
совершает	прогресс,	если	не	встречает	препятствий	
со	стороны	других	потоков
• Без	блокировок	(Lock-Free) — гарантируется	
системный	прогресс	хотя	бы	одного	потока
22
Классификация
• Без	препятствий	(Obstruction-Free)	— поток	
совершает	прогресс,	если	не	встречает	препятствий	
со	стороны	других	потоков
• Без	блокировок	(Lock-Free) — гарантируется	
системный	прогресс	хотя	бы	одного	потока
• Без	ожидания (Wait-Free) — каждая	операция	
выполняется	за	фиксированное	число	шагов,	не	
зависящее	от	других	потоков
23
Сравнительная мощность примитивов
Консенсусные числа различных операций
• Операции	на	регистрах	— 1
• Read-Modification-Write	(RMW) — 2
- Common2	Class — коммутируют	друг	с	
другом	или	перезаписывают	друг	друга
• Универсальные	операции	— ∞
- Сравнение	с	обменом	(CAS)
- Compare-And-Swap,	Compare-And-Set
24
Compare and Swap
• Compare-and-swap (CAS)
- IA32, x64
- SPARC
• load-linked / store-conditional
(LL/SC)
- PowerPC
- ARM
25
Семантика CAS
26
CAS Loop — типичный паттерн применения
1. Прочитать	значение	A	из	переменной	V
2. Взять	какое-то	новое	значение	B	для	V
3. Использовать	CAS	для	атомарного	изменения	V	
из	A	в	B до	тех	пор,	пока	другие	потоки	меняют	
значение	V	во	время	этого	процесса
27
CAS Loop — типичный паттерн применения
1. Прочитать	значение	A	из	переменной	V
2. Взять	какое-то	новое	значение	B	для	V
3. Использовать	CAS	для	атомарного	изменения	V	
из	A	в	B до	тех	пор,	пока	другие	потоки	меняют	
значение	V	во	время	этого	процесса
Атомарность Read-Modify-Write	реализуется	за	счет	
постоянного	мониторинга системы	на	предмет	
постороннего	вмешательства
28
Пример: неблокирующий счетчик
29
Fast vs. slow path
• Каждый	блок	кода	может	иметь,	как	минимум,	
два	пути	исполнения:	короткий	и	длинный
• Lock:	contended	vs.	Uncontended
• Uncontended	Lock:
- ≥	1	CAS
30
Недостатки CAS
• CAS	заставляет	потоки,	которые	его	вызывают,	
работать	в	условиях	соревнования	(contention)
- Больше	contention	=	больше	бесполезных	циклов	
процессора,	трата	процессорного	времени
• Написание	корректных	и	быстрых	алгоритмов	на		
CAS	требует	специальной	подготовки
Поддержка в Java
32
Поддержка CAS в Java
• В	Java	5	появился	JSR166
- пакет	java.util.concurrent
- пакет	java.util.concurrent.atomic
• На	платформах,	поддерживающих	CAS,	JIT-компилятор	
делает	inline	соответствующих	машинных	инструкций
• Load	Linked	/	Store	Conditional
33
Atomic variable classes
• Scalars
• Field updaters
• Arrays
• Compound variables
• Accumulators
- since Java 8
34
Scalars
• AtomicBoolean
• AtomicInteger
• AtomicLong
• AtomicReference
35
AtomicLong
• boolean compareAndSet(int expect, int
update)
• long addAndGet(int delta)
• long getAndAdd(int delta)
• long getAndDecrement()
• long getAndIncrement()
• long incrementAndGet()
• …
36
AtomicLong
• boolean compareAndSet(int expect, int
update)
• long addAndGet(int delta)
• long getAndAdd(int delta)
• long getAndDecrement()
• long getAndIncrement()
• long incrementAndGet()
• …
37
atomicInteger.getAndAdd(5) — Thanks, @AndreiPangin
JDK 7u80 JDK 8u66
83
46
15 11
132
105
45 43
0
20
40
60
80
100
120
140
1 2 3 4
ops/μs
threads
38
JDK 7u80 — atomicLong.getAndAdd(5)
39
JDK 8u66 — atomicLong.getAndAdd(5)
ХардкорЪ
41
atomicLong.getAndAdd(5)
loop:
mov 0x10(%rbx),%rax
mov %rax,%r11
add $0x5,%r11
lock cmpxchg %r11,0x10(%rbx)
sete %r11b
movzbl %r11b,%r11d
test %r10d,%r10d
je loop
JDK 7u80 -XX:+PrintAssembly
42
atomicLong.getAndAdd(5)
lock addq $0x5, 0x10(%rbp)loop:
mov 0x10(%rbx),%rax
mov %rax,%r11
add $0x5,%r11
lock cmpxchg %r11,0x10(%rbx)
sete %r11b
movzbl %r11b,%r11d
test %r10d,%r10d
je loop
JDK 7u80 -XX:+PrintAssembly JDK 8u60
43
atomicLong.getAndAdd(5)
lock addq $0x5, 0x10(%rbp)loop:
mov 0x10(%rbx),%rax
mov %rax,%r11
add $0x5,%r11
lock cmpxchg %r11,0x10(%rbx)
sete %r11b
movzbl %r11b,%r11d
test %r10d,%r10d
je loop
JDK 7u80 -XX:+PrintAssembly JDK 8u60
83
46
15 11
132
105
45 43
1 2 3 4
ops/μs
threads
44
Multivariable Invariant
45
Multivariable Invariant
46
Field Updaters
• AtomicIntegerFieldUpdater
- Reflection-based	updater	for	volatile	int
• AtomicLongFieldUpdater
- Reflection-based	updater	for	volatile	long
• AtomicReferenceFieldUpdater
- Reflection-based	updater	for	volatile	object
47
AtomicLongFieldUpdater
long addAndGet(T obj, long delta)
boolean compareAndSet(T obj, long exp, long upd)
long getAndAdd(T obj, long delta)
long incrementAndGet(T obj)
Demo. Legacy Volatile Counter
49
AtomicLongFieldUpdater
50
AtomicLongFieldUpdater
51
AtomicArrays
• AtomicIntegerArray
• AtomicLongArray
• AtomicReferenceArray
52
AtomicLongArray
• long addAndGet(int i, long delta)
• long getAndAdd(int i, long delta)
• boolean compareAndSet(int i, long exp, long upd)
• long incrementAndGet(int i)
• …
53
Compound Variables
AtomicMarkableReference
V compareAndSet(
V expectedReference, V newReference,
boolean expectedMark, boolean newMark)
AtomicStampedReference
boolean compareAndSet(
V expectedReference, V newReference,
int expectedStamp, int newStamp)
54
Accumulators
• DoubleAccumulator
• DoubleAdder
• LongAccumulator
• LongAdder
• (Striped64)
55
LongAccumulator
• void accumulate(long x)
• long get()
• long getThenReset()
• Void reset()
56
Неблокирующие алгоритмы
• Алгоритм	называется	неблокирующим	
(nonblocking),	если	отказ	или	остановка	любого	
потока	не	может	привести	к	отказу	или	остановке	
любого	другого	потока
56
57
Неблокирующие алгоритмы
• Алгоритм	называется	неблокирующим	
(nonblocking),	если	отказ	или	остановка	любого	
потока	не	может	привести	к	отказу	или	остановке	
любого	другого	потока
• Алгоритм	называется	свободным	от	блокировок
(lock-free),	если	на	каждом	шаге	какой-то	поток	
выполняет	работу	(make	progress)
57
58
Неблокирующие алгоритмы
• Алгоритм	называется	неблокирующим	
(nonblocking),	если	отказ	или	остановка	любого	
потока	не	может	привести	к	отказу	или	остановке	
любого	другого	потока
• Алгоритм	называется	свободным	от	блокировок
(lock-free),	если	на	каждом	шаге	какой-то	поток	
выполняет	работу	(make	progress)
58
nonblocking и	lock-free	— это	разные	вещи!
- Алгоритмы	на	CAS	могут быть	
одновременно	неблокирующими	и	
свободными	от	блокировок
59
Неблокирующие структуры данных
• Стек
• Очереди
- Много	разных	алгоритмов
- Michael	and	Scott,	1996
- Потоки	помогают друг	другу
Литература
61
62
63
64
DL и все-все-все
http://altair.cs.oswego.edu/mailman/listinfo/co
ncurrency-interest
To post a message to all the list members,
send email to
concurrency-interest@cs.oswego.edu
65
Много полезных видео
66
https://bitbucket.org/23derevo/concurrency
Вопросы и ответы
68
Development @ Odnoklassniki
•Blog
-http://habrahabr.ru/company/odnoklassniki
•Open source
-https://github.com/odnoklassniki
•Career
-http://v.ok.ru
Спасибо за внимание!
@23derevo
alexey@jugru.org
alexey.fyodorov@corp.mail.ru

Mais conteúdo relacionado

Destaque

Destaque (10)

P01012016 b
P01012016 bP01012016 b
P01012016 b
 
Redacción de textos
Redacción de textos Redacción de textos
Redacción de textos
 
Circ1139
Circ1139Circ1139
Circ1139
 
Wells Fargo Presentation
Wells Fargo PresentationWells Fargo Presentation
Wells Fargo Presentation
 
Rubrica d’autoavaluació pràcticum ii
Rubrica d’autoavaluació pràcticum iiRubrica d’autoavaluació pràcticum ii
Rubrica d’autoavaluació pràcticum ii
 
Java GC, Off-heap workshop
Java GC, Off-heap workshopJava GC, Off-heap workshop
Java GC, Off-heap workshop
 
Issue 1 NTEU Chapter 164 newsletter
Issue 1 NTEU Chapter 164 newsletterIssue 1 NTEU Chapter 164 newsletter
Issue 1 NTEU Chapter 164 newsletter
 
Ojt moa form
Ojt moa formOjt moa form
Ojt moa form
 
Cebu juan luna ebc acceptance form
Cebu juan luna ebc acceptance formCebu juan luna ebc acceptance form
Cebu juan luna ebc acceptance form
 
Benefits of PRINCE2
Benefits of PRINCE2Benefits of PRINCE2
Benefits of PRINCE2
 

Semelhante a Синхронизация без блокировок и СМС

Алексей Федоров
Алексей ФедоровАлексей Федоров
Алексей ФедоровCodeFest
 
разработка бизнес приложений (7)
разработка бизнес приложений (7)разработка бизнес приложений (7)
разработка бизнес приложений (7)Alexander Gornik
 
What to expect from Java 9
What to expect from Java 9What to expect from Java 9
What to expect from Java 9JavaDayUA
 
Вебинар: Основы распараллеливания С++ программ при помощи OpenMP
Вебинар: Основы распараллеливания С++ программ при помощи OpenMPВебинар: Основы распараллеливания С++ программ при помощи OpenMP
Вебинар: Основы распараллеливания С++ программ при помощи OpenMPFlyElephant
 
Zero Downtime PHP Deployment with Envoyer And Forge
Zero Downtime PHP Deployment with Envoyer And ForgeZero Downtime PHP Deployment with Envoyer And Forge
Zero Downtime PHP Deployment with Envoyer And ForgeYehor Herasymchuk
 
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...CodeFest
 
Java Platform Performance BoF
Java Platform Performance BoFJava Platform Performance BoF
Java Platform Performance BoFDmitry Buzdin
 
Модули в Java
Модули в JavaМодули в Java
Модули в JavaZheka Kozlov
 
Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov
Nonblocking algorithms/CAS/Atomics by Alexey FyodorovNonblocking algorithms/CAS/Atomics by Alexey Fyodorov
Nonblocking algorithms/CAS/Atomics by Alexey FyodorovJavaDayUA
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, ParallelsNikolay Samokhvalov
 
Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...
Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...
Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...Mail.ru Group
 
Atomics, CAS and Nonblocking algorithms
Atomics, CAS and Nonblocking algorithmsAtomics, CAS and Nonblocking algorithms
Atomics, CAS and Nonblocking algorithmsAlexey Fyodorov
 
Распределенные системы в Одноклассниках
Распределенные системы в ОдноклассникахРаспределенные системы в Одноклассниках
Распределенные системы в Одноклассникахodnoklassniki.ru
 
разработка бизнес приложений (6)
разработка бизнес приложений (6)разработка бизнес приложений (6)
разработка бизнес приложений (6)Alexander Gornik
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.Igor Shkulipa
 
Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaAlex Chistyakov
 
How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned Alexander Syrotenko
 
RESTful API: Best practices, versioning, design documentation
RESTful API: Best practices, versioning, design documentationRESTful API: Best practices, versioning, design documentation
RESTful API: Best practices, versioning, design documentationMikhail Shcherbakov
 
MagicPlot @ UXSPb @ IT Global Meetup #7
MagicPlot @ UXSPb @ IT Global Meetup #7MagicPlot @ UXSPb @ IT Global Meetup #7
MagicPlot @ UXSPb @ IT Global Meetup #7Alexander Levantovsky
 
Что и почему писать на Erlang
Что и почему писать на ErlangЧто и почему писать на Erlang
Что и почему писать на ErlangMax Lapshin
 

Semelhante a Синхронизация без блокировок и СМС (20)

Алексей Федоров
Алексей ФедоровАлексей Федоров
Алексей Федоров
 
разработка бизнес приложений (7)
разработка бизнес приложений (7)разработка бизнес приложений (7)
разработка бизнес приложений (7)
 
What to expect from Java 9
What to expect from Java 9What to expect from Java 9
What to expect from Java 9
 
Вебинар: Основы распараллеливания С++ программ при помощи OpenMP
Вебинар: Основы распараллеливания С++ программ при помощи OpenMPВебинар: Основы распараллеливания С++ программ при помощи OpenMP
Вебинар: Основы распараллеливания С++ программ при помощи OpenMP
 
Zero Downtime PHP Deployment with Envoyer And Forge
Zero Downtime PHP Deployment with Envoyer And ForgeZero Downtime PHP Deployment with Envoyer And Forge
Zero Downtime PHP Deployment with Envoyer And Forge
 
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
 
Java Platform Performance BoF
Java Platform Performance BoFJava Platform Performance BoF
Java Platform Performance BoF
 
Модули в Java
Модули в JavaМодули в Java
Модули в Java
 
Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov
Nonblocking algorithms/CAS/Atomics by Alexey FyodorovNonblocking algorithms/CAS/Atomics by Alexey Fyodorov
Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels
 
Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...
Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...
Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...
 
Atomics, CAS and Nonblocking algorithms
Atomics, CAS and Nonblocking algorithmsAtomics, CAS and Nonblocking algorithms
Atomics, CAS and Nonblocking algorithms
 
Распределенные системы в Одноклассниках
Распределенные системы в ОдноклассникахРаспределенные системы в Одноклассниках
Распределенные системы в Одноклассниках
 
разработка бизнес приложений (6)
разработка бизнес приложений (6)разработка бизнес приложений (6)
разработка бизнес приложений (6)
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.
 
Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на Java
 
How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned
 
RESTful API: Best practices, versioning, design documentation
RESTful API: Best practices, versioning, design documentationRESTful API: Best practices, versioning, design documentation
RESTful API: Best practices, versioning, design documentation
 
MagicPlot @ UXSPb @ IT Global Meetup #7
MagicPlot @ UXSPb @ IT Global Meetup #7MagicPlot @ UXSPb @ IT Global Meetup #7
MagicPlot @ UXSPb @ IT Global Meetup #7
 
Что и почему писать на Erlang
Что и почему писать на ErlangЧто и почему писать на Erlang
Что и почему писать на Erlang
 

Mais de Alexey Fyodorov

Non-blocking Michael-Scott queue algorithm
Non-blocking Michael-Scott queue algorithmNon-blocking Michael-Scott queue algorithm
Non-blocking Michael-Scott queue algorithmAlexey Fyodorov
 
How threads help each other
How threads help each otherHow threads help each other
How threads help each otherAlexey Fyodorov
 
Помоги ближнему, или Как потоки помогают друг другу
Помоги ближнему, или Как потоки помогают друг другуПомоги ближнему, или Как потоки помогают друг другу
Помоги ближнему, или Как потоки помогают друг другуAlexey Fyodorov
 
Counter Wars (JEEConf 2016)
Counter Wars (JEEConf 2016)Counter Wars (JEEConf 2016)
Counter Wars (JEEConf 2016)Alexey Fyodorov
 
Non-blocking synchronization — what is it and why we (don't?) need it
Non-blocking synchronization — what is it and why we (don't?) need itNon-blocking synchronization — what is it and why we (don't?) need it
Non-blocking synchronization — what is it and why we (don't?) need itAlexey Fyodorov
 
Unsafe: to be or to be removed?
Unsafe: to be or to be removed?Unsafe: to be or to be removed?
Unsafe: to be or to be removed?Alexey Fyodorov
 
Общество Мертвых Потоков
Общество Мертвых ПотоковОбщество Мертвых Потоков
Общество Мертвых ПотоковAlexey Fyodorov
 
JDK: CPU, PSU, LU, FR — WTF?!
JDK: CPU, PSU, LU, FR — WTF?!JDK: CPU, PSU, LU, FR — WTF?!
JDK: CPU, PSU, LU, FR — WTF?!Alexey Fyodorov
 
Java Platform Tradeoffs (Riga 2013)
Java Platform Tradeoffs (Riga 2013)Java Platform Tradeoffs (Riga 2013)
Java Platform Tradeoffs (Riga 2013)Alexey Fyodorov
 
Java Platform Tradeoffs (CEE SECR 2013)
Java Platform Tradeoffs (CEE SECR 2013)Java Platform Tradeoffs (CEE SECR 2013)
Java Platform Tradeoffs (CEE SECR 2013)Alexey Fyodorov
 
Процесс изменения платформы Java
Процесс изменения платформы JavaПроцесс изменения платформы Java
Процесс изменения платформы JavaAlexey Fyodorov
 
Java: how to thrive in the changing world
Java: how to thrive in the changing worldJava: how to thrive in the changing world
Java: how to thrive in the changing worldAlexey Fyodorov
 

Mais de Alexey Fyodorov (14)

Non-blocking Michael-Scott queue algorithm
Non-blocking Michael-Scott queue algorithmNon-blocking Michael-Scott queue algorithm
Non-blocking Michael-Scott queue algorithm
 
How threads help each other
How threads help each otherHow threads help each other
How threads help each other
 
Помоги ближнему, или Как потоки помогают друг другу
Помоги ближнему, или Как потоки помогают друг другуПомоги ближнему, или Как потоки помогают друг другу
Помоги ближнему, или Как потоки помогают друг другу
 
Counter Wars (JEEConf 2016)
Counter Wars (JEEConf 2016)Counter Wars (JEEConf 2016)
Counter Wars (JEEConf 2016)
 
Non-blocking synchronization — what is it and why we (don't?) need it
Non-blocking synchronization — what is it and why we (don't?) need itNon-blocking synchronization — what is it and why we (don't?) need it
Non-blocking synchronization — what is it and why we (don't?) need it
 
Unsafe: to be or to be removed?
Unsafe: to be or to be removed?Unsafe: to be or to be removed?
Unsafe: to be or to be removed?
 
Общество Мертвых Потоков
Общество Мертвых ПотоковОбщество Мертвых Потоков
Общество Мертвых Потоков
 
JDK: CPU, PSU, LU, FR — WTF?!
JDK: CPU, PSU, LU, FR — WTF?!JDK: CPU, PSU, LU, FR — WTF?!
JDK: CPU, PSU, LU, FR — WTF?!
 
Philosophers
PhilosophersPhilosophers
Philosophers
 
Java in Motion
Java in MotionJava in Motion
Java in Motion
 
Java Platform Tradeoffs (Riga 2013)
Java Platform Tradeoffs (Riga 2013)Java Platform Tradeoffs (Riga 2013)
Java Platform Tradeoffs (Riga 2013)
 
Java Platform Tradeoffs (CEE SECR 2013)
Java Platform Tradeoffs (CEE SECR 2013)Java Platform Tradeoffs (CEE SECR 2013)
Java Platform Tradeoffs (CEE SECR 2013)
 
Процесс изменения платформы Java
Процесс изменения платформы JavaПроцесс изменения платформы Java
Процесс изменения платформы Java
 
Java: how to thrive in the changing world
Java: how to thrive in the changing worldJava: how to thrive in the changing world
Java: how to thrive in the changing world
 

Синхронизация без блокировок и СМС