SlideShare a Scribd company logo
Scale	Up	with	
Lock-Free	Algorithms
Non-blocking	concurrency	on	JVM
Presented	at	JavaOne 2017
/Roman	Elizarov	@	JetBrains
Speaker:	Roman	Elizarov
• 16+	years	experience
• Previously	developed	high-perf	trading	software	
@	Devexperts
• Teach	concurrent	&	distributed	programming	
@	St.	Petersburg	ITMO	University
• Chief	judge	
@	Northern	Eurasia	Contest	/	ACM	ICPC	
• Now	work	on	Kotlin	
@	JetBrains
Shared
Shared	Mutable
Shared	Mutable	State
Scale Up with Lock-Free Algorithms @ JavaOne
Scale Up with Lock-Free Algorithms @ JavaOne
Shared	Mutable	State
Why?
Big	Big	Data
Data	1 Data	2 Data	N
Data	1 Data	2 Data	N
map map map
Data	1 Data	2 Data	N
map map map
reduce
answer
Embarrassingly	parallel
Data	1 Data	2 Data	N
map map map
reduce
answer
Big	Big	Data
Big	Big	Data
Real-time
Big	Big	Data
Real-time
Concurrent	requests	/	processing
Big	Big	Data
Real-time
Concurrent	requests	/	processing
Performance Scalability
Scale Up with Lock-Free Algorithms @ JavaOne
A	toy	problem
A	toy	problem	– stack
A	toy	problem	– stack
class Node<T>(val next: Node<T>?, val value: T)
public final class Node<T> {
private final Node<T> next;
private final T value;
public Node(Node<T> next, T value) {
this.next = next;
this.value = value;
}
public Node<T> getNext() {
return next;
}
public T getValue() {
return value;
}
}
A	toy	problem	– stack
A	toy	problem	– stack
class Node<T>(val next: Node<T>?, val value: T)
A	toy	problem	– empty	stack
class Node<T>(val next: Node<T>?, val value: T)
top
A	toy	problem	– stack	push
class Node<T>(val next: Node<T>?, val value: T)
next = null
value = 1
top А
A	toy	problem	– stack	push
class Node<T>(val next: Node<T>?, val value: T)
next = null
value = 1
top А
next = A
value = 2
B
A	toy	problem	– stack	push
class Node<T>(val next: Node<T>?, val value: T)
next = null
value = 1
top А
next = A
value = 2
B
A	toy	problem	– stack	push
class Node<T>(val next: Node<T>?, val value: T)
next = A
value = 2
top
next = null
value = 1
B A
A	toy	problem	– stack	push
class Node<T>(val next: Node<T>?, val value: T)
class LinkedStack<T> {
private var top: Node<T>? = null
fun push(value: T) {
top = Node(top, value)
}
}
A	toy	problem	– stack	push
class Node<T>(val next: Node<T>?, val value: T)
class LinkedStack<T> {
private var top: Node<T>? = null
fun push(value: T) {
top = Node(top, value)
}
}
A	toy	problem	– stack	push
class Node<T>(val next: Node<T>?, val value: T)
class LinkedStack<T> {
private var top: Node<T>? = null
fun push(value: T) {
top = Node(top, value)
}
}
A	toy	problem	– stack
class Node<T>(val next: Node<T>?, val value: T)
next = A
value = 2
top
next = null
value = 1
B A
A	toy	problem	– stack	pop
class Node<T>(val next: Node<T>?, val value: T)
next = A
value = 2
top
next = null
value = 1
B A
cur
A	toy	problem	– stack	pop
class Node<T>(val next: Node<T>?, val value: T)
next = A
value = 2
top
next = null
value = 1
B A
cur
A	toy	problem	– stack	pop
class Node<T>(val next: Node<T>?, val value: T)
next = A
value = 2
top
next = null
value = 1
B A
cur
result = 2
A	toy	problem	– stack	pop
class Node<T>(val next: Node<T>?, val value: T)
class LinkedStack<T> {
private var top: Node<T>? = null
fun push(value: T) {
top = Node(top, value)
}
fun pop(): T? {
val cur = top ?: return null
top = cur.next
return cur.value
}
}
A	toy	problem	– stack
class Node<T>(val next: Node<T>?, val value: T)
class LinkedStack<T> {
private var top: Node<T>? = null
fun push(value: T) {
top = Node(top, value)
}
fun pop(): T? {
val cur = top ?: return null
top = cur.next
return cur.value
}
}
Does	it	work?
A	toy	problem	– concurrent	push
class Node<T>(val next: Node<T>?, val value: T)
next = null
value = 1
top А
next = A
value = 2
B
A	toy	problem	– concurrent	push
class Node<T>(val next: Node<T>?, val value: T)
next = null
value = 1
top А
next = A
value = 2
B
next = A
value = 3
C
A	toy	problem	– concurrent	push
class Node<T>(val next: Node<T>?, val value: T)
next = null
value = 1
top А
next = A
value = 2
B
next = A
value = 3
C
A	toy	problem	– synchronized	stack
class Node<T>(val next: Node<T>?, val value: T)
class LinkedStack<T> {
private var top: Node<T>? = null
@Synchronized
fun push(value: T) {
top = Node(top, value)
}
@Synchronized
fun pop(): T? {
val cur = top ?: return null
top = cur.next
return cur.value
}
}
Does	it	scale?
Benchmark
@State(Scope.Benchmark)
open class LinkedStackBenchmark {
private val stack = LinkedStack<Int>()
@Benchmark
fun benchmark() {
stack.push(1)
check(stack.pop() == 1)
}
}
Benchmark
@State(Scope.Benchmark)
open class LinkedStackBenchmark {
private val stack = LinkedStack<Int>()
@Benchmark
fun benchmark() {
stack.push(1)
check(stack.pop() == 1)
}
}
Benchmark	results
0
5
10
15
20
25
1 2 4 8 16 32 64 128
Millions
Number	of	threads
Throughput	(ops/s)
LinkedStack
Intel(R)	Xeon(R)	CPU	E5-2680	v2	@	2.80GHz;	32	HW	threads;	Java	HotSpot(TM)	64-Bit	Server	VM	(build	9+181,	mixed	mode)
Contention
P
Q
pop1
Contention
P
Q
pop1
Contention
P
Q
pop1
pop2
wait
Contention
P
Q work
pop1
pop2
wait
Deadlocks
Lock-free?
Lock-free	push
class Node<T>(val next: Node<T>?, val value: T)
next = null
value = 1
top А
next = A
value = 2
B
expect
Lock-free	push
class Node<T>(val next: Node<T>?, val value: T)
next = null
value = 1
top А
next = A
value = 2
B
update
Lock-free	push
class Node<T>(val next: Node<T>?, val value: T)
next = null
value = 1
top А
next = A
value = 2
B
update
expect
AtomicReference
package java.util.concurrent.atomic;
/** @since 1.5 */
public class AtomicReference<V> {
private volatile V value;
public V get() {
return value;
}
public boolean compareAndSet(V expect, V update) {
// …
}
}
AtomicReference
package java.util.concurrent.atomic;
/** @since 1.5 */
public class AtomicReference<V> {
private volatile V value;
public V get() {
return value;
}
public boolean compareAndSet(V expect, V update) {
// …
}
}
AtomicReference
package java.util.concurrent.atomic;
/** @since 1.5 */
public class AtomicReference<V> {
private volatile V value;
public V get() {
return value;
}
public boolean compareAndSet(V expect, V update) {
// …
}
}
Using	AtomicReference
class LockFree<T> {
private val top = AtomicReference<Node<T>?>(null)
fun push(value: T) {
while (true) {
val cur = top.get()
val upd = Node(cur, value)
if (top.compareAndSet(cur, upd)) return
}
}
}
Using	AtomicReference
class LockFree<T> {
private val top = AtomicReference<Node<T>?>(null)
fun push(value: T) {
while (true) {
val cur = top.get()
val upd = Node(cur, value)
if (top.compareAndSet(cur, upd)) return
}
}
}
Using	AtomicReference - push
class LockFree<T> {
private val top = AtomicReference<Node<T>?>(null)
fun push(value: T) {
while (true) {
val cur = top.get()
val upd = Node(cur, value)
if (top.compareAndSet(cur, upd)) return
}
}
}
1
Using	AtomicReference - push
class LockFree<T> {
private val top = AtomicReference<Node<T>?>(null)
fun push(value: T) {
while (true) {
val cur = top.get()
val upd = Node(cur, value)
if (top.compareAndSet(cur, upd)) return
}
}
}
1
2
Using	AtomicReference
class LockFree<T> {
private val top = AtomicReference<Node<T>?>(null)
fun push(value: T) {
while (true) {
val cur = top.get()
val upd = Node(cur, value)
if (top.compareAndSet(cur, upd)) return
}
}
}
1
2
3
Using	AtomicReference - push
1
2
3
class LockFree<T> {
private val top = AtomicReference<Node<T>?>(null)
fun push(value: T) {
while (true) {
val cur = top.get()
val upd = Node(cur, value)
if (top.compareAndSet(cur, upd)) return
}
}
}
Powerful	we	have	become!
Using	AtomicReference - pop
class LockFree<T> {
private val top = AtomicReference<Node<T>?>(null)
fun push(value: T) { … }
fun pop(): T? {
while (true) {
val cur = top.get() ?: return null
if (top.compareAndSet(cur, cur.next)) return cur.value
}
}
}
Using	AtomicReference
class LockFree<T> {
private val top = AtomicReference<Node<T>?>(null)
fun push(value: T) { … }
fun pop(): T? { … }
}
It’s	a	trap
Using	volatile	variable
class LinkedStackLF<T> {
@Volatile
private var top: Node<T>? = null
fun push(value: T) {
// ...
}
}
Using	AtomicReferenceFieldUpdater
package java.util.concurrent.atomic;
/** @since 1.5 */
public abstract class AtomicReferenceFieldUpdater<T,V> {
public static <U,W> AtomicReferenceFieldUpdater<U,W> newUpdater(
Class<U> tclass, Class<W> vclass, String fieldName;
public abstract boolean compareAndSet(T obj, V expect, V update;
}
Using	AtomicReferenceFieldUpdater
private volatile Node<T> top;
Using	AtomicReferenceFieldUpdater
private volatile Node<T> top;
private static final AtomicReferenceFieldUpdater<LockFree, Node>
TOP = AtomicReferenceFieldUpdater
.newUpdater(LockFree.class, Node.class, "top");
Using	AtomicReferenceFieldUpdater
private volatile Node<T> top;
private static final AtomicReferenceFieldUpdater<LockFree, Node>
TOP = AtomicReferenceFieldUpdater
.newUpdater(LockFree.class, Node.class, "top");
if (TOP.compareAndSet(this, cur, upd)) return;
Using	VarHandle
package java.lang.invoke;
/** @since 9 */
public abstract class VarHandle {
@MethodHandle.PolymorphicSignature
public native boolean compareAndSet(Object... args);
}
Using	VarHandle
private volatile Node<T> top;
private static final VarHandle TOP;
static {
try {
TOP = MethodHandles.lookup()
.findVarHandle(LockFree.class, "top", Node.class);
} catch (NoSuchFieldException | IllegalAccessException e) {
throw new InternalError(e);
}
}
Using	VarHandle
private volatile Node<T> top;
private static final VarHandle TOP;
static {
try {
TOP = MethodHandles.lookup()
.findVarHandle(LockFree.class, "top", Node.class);
} catch (NoSuchFieldException | IllegalAccessException e) {
throw new InternalError(e);
}
}
if (TOP.compareAndSet(this, cur, upd) return;
Using	AtomicFU J
private val top = atomic<Node<T>?>(null)
Using	AtomicFU J
private val top = atomic<Node<T>?>(null)
if (top.compareAndSet(cur, upd)) return
Using	AtomicFU J
private val top = atomic<Node<T>?>(null)
if (top.compareAndSet(cur, upd)) return
Code	like	
AtomicReference
Using	AtomicFU J
private val top = atomic<Node<T>?>(null)
if (top.compareAndSet(cur, upd)) return
Bytecode
Code	like	
AtomicReference
compile
Using	AtomicFU J
private val top = atomic<Node<T>?>(null)
if (top.compareAndSet(cur, upd)) return
Bytecode
Code	like	
AtomicReference
AtomicReferenceFUcompile atomicFU
Using	AtomicFU J
private val top = atomic<Node<T>?>(null)
if (top.compareAndSet(cur, upd)) return
Bytecode
Code	like	
AtomicReference
VarHandlecompile atomicFU
Was	it	worth	it?
Benchmark	results
0
5
10
15
20
25
30
35
40
1 2 4 8 16 32 64 128
Millions
Number	of	threads
Throughput	(ops/s)
LockFree
LinkedStack
0
5
10
15
20
25
30
35
40
1 2 4 8 16 32 64 128
Millions
Number	of	threads
Throughput	(ops/s)
LockFree
LinkedStack
Benchmark	results
Yeh!
Nay…
Contention
P
Q retry
pop1
pop2
try	update
Too	toy	of	a	problem?
class LinkedStack<T> {
private var top: Node<T>? = null
@Synchronized
fun push(value: T) { … }
@Synchronized
fun pop(): T? {
val cur = top ?: return null
top = cur.next
return cur.value
}
}
Too	toy	of	a	problem	– make	it	more real?
class LinkedStack<T> {
private var top: Node<T>? = null
@Synchronized
fun push(value: T) { … }
@Synchronized
fun pop(): T? {
val cur = top ?: return null
top = cur.next
Blackhole.consumeCPU(100L)
return cur.value
}
}
Too	toy	of	a	problem	– make	it	more real?
class LockFree<T> {
private val top = atomic<Node<T>?>(null)
fun push(value: T) { … }
fun pop(): T? {
while (true) {
val cur = top.value ?: return null
Blackhole.consumeCPU(100L)
if (top.compareAndSet(cur, cur.next)) return cur.value
}
}
}
Benchmark	results
0
0.5
1
1.5
2
2.5
3
3.5
4
4.5
1 2 4 8 16 32 64 128
Millions
Number	of	threads
Throughput	(ops/s)
LockFree
LinkedStack
Workload
@State(Scope.Benchmark)
open class LinkedStackBenchmark {
private val stack = LinkedStack<Int>()
@Benchmark
fun benchmark() {
stack.push(1)
check(stack.pop() == 1)
}
}
Read-dominated	workload
@State(Scope.Benchmark)
open class LinkedStackBenchmark {
private val stack = LinkedStack<Int>()
@Benchmark
fun benchmarkReadDominated() {
stack.push(1)
repeat(10) { check(stack.peek() == 1) }
check(stack.pop() == 1)
}
}
Read-dominated	workload
@State(Scope.Benchmark)
open class LinkedStackBenchmark {
private val stack = LinkedStack<Int>()
@Benchmark
fun benchmarkReadDominated() {
stack.push(1)
repeat(10) { check(stack.peek() == 1) }
check(stack.pop() == 1)
}
}
class LinkedStack<T> {
@Synchronized
fun peek() = top?.value
}
Read-dominated	workload
@State(Scope.Benchmark)
open class LockFreeBenchmark {
private val stack = LockFree<Int>()
@Benchmark
fun benchmarkReadDominated() {
stack.push(1)
repeat(10) { check(stack.peek() == 1) }
check(stack.pop() == 1)
}
}
class LockFree<T> {
fun peek() = top.value?.value
}
Benchmark	results	– x10	reads
0
5
10
15
20
25
1 2 4 8 16 32 64 128
Millions
Number	of	threads
Throughput	(ops/s)
LockFree
LinkedStack
Benchmark	results	– x100	reads
0
1
2
3
4
5
6
1 2 4 8 16 32 64 128
Millions
Number	of	threads
Throughput	(ops/s)
LockFree
LinkedStack
But	… scalability?
Real-world	workload
@Benchmark
fun benchmarkReadWorld() {
stack.push(1)
repeat(10) {
check(stack.peek() == 1)
Blackhole.consumeCPU(100L)
}
check(stack.pop() == 1)
Blackhole.consumeCPU(100L)
}
Benchmark	results	– real	world
0
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
1.8
1 2 4 8 16 32 64 128
Millions
Number	of	threads
Throughput	(ops/s)
LockFree
LinkedStack
Learn	to	ask	the	right	questions
You	shall,	young	Padawan.
Scale Up with Lock-Free Algorithms @ JavaOne
Links
• JMH	 http://openjdk.java.net/projects/code-tools/jmh/
• Kotlin	 https://kotlinlang.org
• AtomicFU https://github.com/Kotlin/kotlinx.atomicfu
Thank	you
Any	questions?
Slides	are	available	at	www.slideshare.net/elizarov
email	me	to	elizarov at	gmail
relizarov
Appendix
A	toy	problem	– concurrent	pop
class Node<T>(val next: Node<T>?, val value: T)
next = A
value = 2
top
next = null
value = 1
B A
cur1 cur2
A	toy	problem	– concurrent	pop
class Node<T>(val next: Node<T>?, val value: T)
next = A
value = 2
top
next = null
value = 1
B A
cur1 cur2
A	toy	problem	– concurrent	pop
class Node<T>(val next: Node<T>?, val value: T)
next = A
value = 2
top
next = null
value = 1
B A
result1 = 2
cur1 cur2
result2 = 2

More Related Content

PDF
Idiomatic Kotlin
PDF
[Codemotion 2015] patrones de diseño con java8
PDF
Kotlin, why?
PDF
Sneaking inside Kotlin features
PDF
Feel of Kotlin (Berlin JUG 16 Apr 2015)
PDF
JVMLS 2016. Coroutines in Kotlin
PDF
Kotlin from-scratch 2 - functions
PPTX
Introduction to kotlin + spring boot demo
Idiomatic Kotlin
[Codemotion 2015] patrones de diseño con java8
Kotlin, why?
Sneaking inside Kotlin features
Feel of Kotlin (Berlin JUG 16 Apr 2015)
JVMLS 2016. Coroutines in Kotlin
Kotlin from-scratch 2 - functions
Introduction to kotlin + spring boot demo

What's hot (20)

PDF
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
PDF
From java to kotlin beyond alt+shift+cmd+k - Droidcon italy
PPTX
Kotlin standard
PDF
Csharp_Chap13
KEY
Erlang bootstrap course
PPTX
Kotlin class
PDF
Blazing Fast, Pure Effects without Monads — LambdaConf 2018
PPTX
Fourier project presentation
PDF
Ray tracing with ZIO-ZLayer
PDF
Kotlin: a better Java
PDF
Ray Tracing with ZIO
PDF
​"Delegates, Delegates everywhere" Владимир Миронов
PDF
Connecting your phone and home with firebase and android things - James Cogga...
PPT
Thread
PDF
От Java Threads к лямбдам, Андрей Родионов
PDF
Fun with Kotlin
PDF
The Death of Final Tagless
PDF
Java VS Python
PDF
What's in Kotlin for us - Alexandre Greschon, MyHeritage
PPTX
The Challenge of Bringing FEZ to PlayStation Platforms
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
From java to kotlin beyond alt+shift+cmd+k - Droidcon italy
Kotlin standard
Csharp_Chap13
Erlang bootstrap course
Kotlin class
Blazing Fast, Pure Effects without Monads — LambdaConf 2018
Fourier project presentation
Ray tracing with ZIO-ZLayer
Kotlin: a better Java
Ray Tracing with ZIO
​"Delegates, Delegates everywhere" Владимир Миронов
Connecting your phone and home with firebase and android things - James Cogga...
Thread
От Java Threads к лямбдам, Андрей Родионов
Fun with Kotlin
The Death of Final Tagless
Java VS Python
What's in Kotlin for us - Alexandre Greschon, MyHeritage
The Challenge of Bringing FEZ to PlayStation Platforms
Ad

Viewers also liked (20)

PPT
DevRomagna / Golang Intro
PPTX
In-Memory Computing Essentials for Architects and Engineers
PDF
numPYNQ @ NGCLE@e-Novia 15.11.2017
PPTX
Walk through an enterprise Linux migration
PPTX
Graduating To Go - A Jumpstart into the Go Programming Language
PDF
[若渴計畫] Challenges and Solutions of Window Remote Shellcode
PPTX
Docker Networking
PDF
OCCIware, an extensible, standard-based XaaS consumer platform to manage ever...
PDF
Linux Security APIs and the Chromium Sandbox (SwedenCpp Meetup 2017)
PPTX
Communication hardware
PDF
Advanced memory allocation
PPTX
What in the World is Going on at The Linux Foundation?
PPTX
Server virtualization
PDF
Go Execution Tracer
PPTX
Virtualization
PPTX
OpenFlow
PPTX
SDN Architecture & Ecosystem
PDF
In-depth forensic analysis of Windows registry files
PDF
Deep dive into Coroutines on JVM @ KotlinConf 2017
PPTX
Network Virtualization
DevRomagna / Golang Intro
In-Memory Computing Essentials for Architects and Engineers
numPYNQ @ NGCLE@e-Novia 15.11.2017
Walk through an enterprise Linux migration
Graduating To Go - A Jumpstart into the Go Programming Language
[若渴計畫] Challenges and Solutions of Window Remote Shellcode
Docker Networking
OCCIware, an extensible, standard-based XaaS consumer platform to manage ever...
Linux Security APIs and the Chromium Sandbox (SwedenCpp Meetup 2017)
Communication hardware
Advanced memory allocation
What in the World is Going on at The Linux Foundation?
Server virtualization
Go Execution Tracer
Virtualization
OpenFlow
SDN Architecture & Ecosystem
In-depth forensic analysis of Windows registry files
Deep dive into Coroutines on JVM @ KotlinConf 2017
Network Virtualization
Ad

Similar to Scale Up with Lock-Free Algorithms @ JavaOne (20)

PDF
Dip into Coroutines - KTUG Munich 202303
PPTX
Generics jehfkhkshfhskjghkshhhhlshluhueheuhuhhlhkhk.pptx
PPTX
Concurrent Application Development using Scala
PPTX
TensorFlow for IITians
PDF
Kotlin : Advanced Tricks - Ubiratan Soares
PPTX
Laziness, trampolines, monoids and other functional amenities: this is not yo...
PDF
Kotlin Advanced - Apalon Kotlin Sprint Part 3
ODP
Software Transactioneel Geheugen
PDF
Monadologie
PPTX
Introduction to Neural Networks and Deep Learning from Scratch
PDF
Using visual studio 2022- a C# windows form application- and your Doub.pdf
PPTX
Implementation of stacks and queues in C
ODP
Scala+swing
PDF
The TclQuadcode Compiler
PPT
SDC - Einführung in Scala
PDF
Help please, I have attached LinkedList.cpp and LinkedList.hPlease.pdf
PDF
Coroutines in Kotlin. In-depth review
PDF
Coroutines in Kotlin. UA Mobile 2017.
PDF
Taming Asynchronous Transforms with Interstellar
PDF
Mastering Kotlin Standard Library
Dip into Coroutines - KTUG Munich 202303
Generics jehfkhkshfhskjghkshhhhlshluhueheuhuhhlhkhk.pptx
Concurrent Application Development using Scala
TensorFlow for IITians
Kotlin : Advanced Tricks - Ubiratan Soares
Laziness, trampolines, monoids and other functional amenities: this is not yo...
Kotlin Advanced - Apalon Kotlin Sprint Part 3
Software Transactioneel Geheugen
Monadologie
Introduction to Neural Networks and Deep Learning from Scratch
Using visual studio 2022- a C# windows form application- and your Doub.pdf
Implementation of stacks and queues in C
Scala+swing
The TclQuadcode Compiler
SDC - Einführung in Scala
Help please, I have attached LinkedList.cpp and LinkedList.hPlease.pdf
Coroutines in Kotlin. In-depth review
Coroutines in Kotlin. UA Mobile 2017.
Taming Asynchronous Transforms with Interstellar
Mastering Kotlin Standard Library

More from Roman Elizarov (20)

PDF
Kotlin Coroutines in Practice @ KotlinConf 2018
PDF
Introduction to Coroutines @ KotlinConf 2017
PDF
Fresh Async with Kotlin @ QConSF 2017
PDF
Kotlin Coroutines Reloaded
PDF
Lock-free algorithms for Kotlin Coroutines
PDF
Introduction to Kotlin coroutines
PPTX
Non blocking programming and waiting
PDF
ACM ICPC 2016 NEERC (Northeastern European Regional Contest) Problems Review
PDF
Многопоточное Программирование - Теория и Практика
PDF
Wait for your fortune without Blocking!
PDF
ACM ICPC 2015 NEERC (Northeastern European Regional Contest) Problems Review
PDF
ACM ICPC 2014 NEERC (Northeastern European Regional Contest) Problems Review
PDF
Why GC is eating all my CPU?
PDF
Многопоточные Алгоритмы (для BitByte 2014)
PDF
Теоретический минимум для понимания Java Memory Model (для JPoint 2014)
PPTX
DIY Java Profiling
PDF
ACM ICPC 2013 NEERC (Northeastern European Regional Contest) Problems Review
PPTX
Java Serialization Facts and Fallacies
PPTX
Millions quotes per second in pure java
PPTX
ACM ICPC 2012 NEERC (Northeastern European Regional Contest) Problems Review
Kotlin Coroutines in Practice @ KotlinConf 2018
Introduction to Coroutines @ KotlinConf 2017
Fresh Async with Kotlin @ QConSF 2017
Kotlin Coroutines Reloaded
Lock-free algorithms for Kotlin Coroutines
Introduction to Kotlin coroutines
Non blocking programming and waiting
ACM ICPC 2016 NEERC (Northeastern European Regional Contest) Problems Review
Многопоточное Программирование - Теория и Практика
Wait for your fortune without Blocking!
ACM ICPC 2015 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2014 NEERC (Northeastern European Regional Contest) Problems Review
Why GC is eating all my CPU?
Многопоточные Алгоритмы (для BitByte 2014)
Теоретический минимум для понимания Java Memory Model (для JPoint 2014)
DIY Java Profiling
ACM ICPC 2013 NEERC (Northeastern European Regional Contest) Problems Review
Java Serialization Facts and Fallacies
Millions quotes per second in pure java
ACM ICPC 2012 NEERC (Northeastern European Regional Contest) Problems Review

Recently uploaded (20)

PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PDF
Modernizing your data center with Dell and AMD
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PPTX
Cloud computing and distributed systems.
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Empathic Computing: Creating Shared Understanding
PDF
Machine learning based COVID-19 study performance prediction
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
Understanding_Digital_Forensics_Presentation.pptx
MYSQL Presentation for SQL database connectivity
Diabetes mellitus diagnosis method based random forest with bat algorithm
Building Integrated photovoltaic BIPV_UPV.pdf
CIFDAQ's Market Insight: SEC Turns Pro Crypto
Modernizing your data center with Dell and AMD
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
20250228 LYD VKU AI Blended-Learning.pptx
Cloud computing and distributed systems.
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Per capita expenditure prediction using model stacking based on satellite ima...
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Empathic Computing: Creating Shared Understanding
Machine learning based COVID-19 study performance prediction

Scale Up with Lock-Free Algorithms @ JavaOne