SlideShare a Scribd company logo
1 of 47
Download to read offline
Concurrency	Patterns	
In	Kotlin
Huynh	Quang	Thao	
Trusting		Social	
Google	Developer	Expert
Myself
- Nationality:	Vietnam	
- Company:	Trusting	Social	-	Eintech	company	provided	credit	score	for	unbanked	users.	
- Working:	Backend,	Infrastructure,	and	Mobile	(side	project)	
- Member	of	GDE	(Google	Developer	expert)	
- Blog:	https://medium.com/@huynhquangthao		
- StackOverFlow:	https://stackoverElow.com/users/1192728/hqt	(24,000	points	til	now)
Operating		System	threads
- Process	is	the	instance	of	a	computer	program	that	is	being	executed	
by	one	or	many	threads
Operating		System	threads
- Process	is	the	instance	of	a	computer	program	that	is	being	executed	
by	one	or	many	threads	
- Threads	are	spawn	from	the	process	that	they	share	the	same	memory	
space.
Operating		System	threads
- Process	is	the	instance	of	a	computer	program	that	is	being	executed	
by	one	or	many	threads	
- Threads	are	spawn	from	the	process	that	they	share	the	same	memory	
space.	
Context	Switching
Coroutines	
- Coroutines	are	very	similar	to	threads.		(100_000	coroutines	easily)
Coroutines	
- Coroutines	are	very	similar	to	threads.		(100_000	coroutines	easily)	
- Coroutines	are	cooperatively	multitasked.	This	means	that	coroutines	
provide	concurrency	but	not	parallelism.
Coroutines	
- Coroutines	are	very	similar	to	threads.		(100_000	coroutines	easily)	
- Coroutines	are	cooperatively	multitasked.	This	means	that	coroutines	
provide	concurrency	but	not	parallelism.	
- Switching	between	coroutines	need	not	involve	any	system	calls	or	
any	blocking	calls	whatsoever.
fun spawnThreads() {
repeat(100_000) {
thread {
sleep(1000)
print(".")
}
}
}
fun spawnCoroutine() = runBlocking {
repeat(100_000) {
// launch a lot of coroutines
launch {
delay(1000L)
print(".")
}
}
}
Concurrency	not	parallelism	
Scenario:	We	have	2	very	important	tasks	in	one	day:	
1.Get	a	passport	
2.Get	a	presentation	done
Concurrency	not	parallelism	
Scenario:	We	have	2	very	important	tasks	in	one	day:	
1.Get	a	passport	
2.Get	a	presentation	done
Solution	1:	Sequential	Execution	
- passport	ofEice	for	2	hours	
- wait	in	the	line	for	4	hours	get	the	task	done	
- drive	back	2	hours,	go	home		
- stay	awake	5	more	hours	and	get	presentation	done.	
Cost:	13	hours.
Concurrency	not	parallelism	
Scenario:	We	have	2	very	important	tasks	in	one	day:	
1.Get	a	passport	
2.Get	a	presentation	done
Solution	2:	Concurrency	Execution	
- passport	ofEice	for	2	hours	
- wait	in	the	line	for	4	hours.	Start	working	on	the	presentation.	
- drive	back	2	hours,	go	home		
- stay	awake	1	more	hours	and	get	presentation	done.	
Cost:	9	hours
Concurrency	not	parallelism	
Scenario:	We	have	2	very	important	tasks	in	one	day:	
1.Get	a	passport	
2.Get	a	presentation	done
Solution	3:	Parallel	Execution	
- passport	ofEice	for	2	hours	
- In	them	same	time,	assistant	works	on	the	presentation.	
- wait	in	the	line	for	4	hours.		
- drive	back	2	hours,	go	home		
- stay	awake	1	more	hours	and	get	presentation	done.	
Cost:	9	hours
Concurrency	not	parallelism	
Scenario:	We	have	2	very	important	tasks	in	one	day:	
1.Get	a	passport	
2.Get	a	presentation	done
Solution	4:	Concurrent	and	Parallel	
- passport	ofEice	for	2	hours	
- In	them	same	time,	assistant	works	on	the	presentation.	
- wait	in	the	line	for	4	hours.	Check	the	Eirst	draft	and	give	comments.	
- drive	back	2	hours,	go	home		
- stay	awake	15	minutes	more	hours	and	get	presentation	done.	
Cost:	6	hours	15	minutes
Concurrency	not	parallelism	
Scenario:	We	have	2	very	important	tasks	in	one	day:	
1.Get	a	passport	
2.Get	a	presentation	done
Looking	back:	
- Get	a	passport	and	get	a	presentation	are	jobs.	
- Waiting	at	the	line	is	I/O	time.	
- Manager	and	Secretary	are	CPU	computational	resources.
Concurrency	not	parallelism	
Scenario:	We	have	2	very	important	tasks	in	one	day:	
1.Get	a	passport	
2.Get	10	presentations	done
Concurrency	not	parallelism	
Scenario:	We	have	2	very	important	tasks	in	one	day:	
1.Get	a	passport	
2.Get	10	presentations	done
Solution:	
- Get	a	passport	on	one	coroutine.	
- Each	presentation	work	is	on	one	coroutine.	
- Communication	between	coroutines	using	channel.
Concurrency	not	parallelism	
Scenario:	We	have	2	very	important	tasks	in	one	day:	
1.Get	a	passport	
2.Get	10	presentations	done
Solution:	
- Get	a	passport	on	one	coroutine.	
- Each	presentation	work	is	on	one	coroutine.	
- Communication	between	coroutines	using	channel.
Environment:	
- CPU	with	1	core.	
- CPU	with	2	cores.	
- CPU	with	multiple	cores.	
-->	Abstract	the		thread	handling	behind.
Concurrency	not	parallelism	
Concurrency	is	about	dealing	with	lots	of	things	at	once.	
Parallelism	is	about	doing	lots	of	things	at	once.	
-->	Concurrency	is	about	structure,	parallelism	is	about	execution.
Concurrency	not	parallelism	
Concurrency	is	about	dealing	with	lots	of	things	at	once.	
Parallelism	is	about	doing	lots	of	things	at	once.	
-->	Concurrency	is	about	structure,	parallelism	is	about	execution.	
Concurrency	provides	a	way	to	structure	a	solution	to	solve	a	problem	
that	may	(but	not	necessarily)	be	parallelizable.
Concurrency	not	parallelism	
Concurrency	is	about	dealing	with	lots	of	things	at	once.	
Parallelism	is	about	doing	lots	of	things	at	once.	
-->	Concurrency	is	about	structure,	parallelism	is	about	execution.	
Concurrency	provides	a	way	to	structure	a	solution	to	solve	a	problem	
that	may	(but	not	necessarily)	be	parallelizable.	
Coroutine/channel	open	a	lot	of	chance	to	solve	concurrency	
problems.
Concurrency	Patterns
Pipelines
- A	pipeline	is	a	pattern	where	one	coroutine	is	producing,	possibly	inEinite,	
stream	of	values	
- A	pipeline	is	a	great	way	to	break	a	long	process	into	smaller	steps.
Pipelines
- A	pipeline	is	a	pattern	where	one	coroutine	is	producing,	possibly	inEinite,	
stream	of	values	
- A	pipeline	is	a	great	way	to	break	a	long	process	into	smaller	steps.
Pipelines
- A	pipeline	is	a	pattern	where	one	coroutine	is	producing,	possibly	inEinite,	
stream	of	values	
- A	pipeline	is	a	great	way	to	break	a	long	process	into	smaller	steps.
Pipelinesfun CoroutineScope.produceNumbers() = produce<Int> {
var x = 1
while (true) send(x++) // infinite stream of integers starting from 1
}
Pipelinesfun CoroutineScope.produceNumbers() = produce<Int> {
var x = 1
while (true) send(x++) // infinite stream of integers starting from 1
}
fun CoroutineScope.square(numbers: ReceiveChannel<Int>): ReceiveChannel<Int> = produce {
for (x in numbers) send(x * x)
}
Pipelinesfun CoroutineScope.produceNumbers() = produce<Int> {
var x = 1
while (true) send(x++) // infinite stream of integers starting from 1
}
fun CoroutineScope.square(numbers: ReceiveChannel<Int>): ReceiveChannel<Int> = produce {
for (x in numbers) send(x * x)
}
fun pipeline() = runBlocking {
val numbers = produceNumbers() // produces integers from 1 and on
val squares = square(numbers) // squares integers
for (i in 1..5) println(squares.receive()) // print first five
println("Done!") // we are done
coroutineContext.cancelChildren() // cancel children coroutines
}
Select	Expression
Select	expression	makes	it	possible	to	await	multiple	suspending	
functions	simultaneously	and	select	the	Eirst	one	that	becomes	available.	
Select	expressions	are	an	experimental	features.
Select	Expressionsuspend fun processJob(
streamOne: ReceiveChannel<String>,
streamSecond: ReceiveChannel<String>) {
while (true) {
select<Unit> {
streamOne.onReceive { value ->
println("stream-one -> '$value'")
}
streamSecond.onReceive { value ->
println("stream-second -> '$value'")
}
}
}
println("End")
}
stream-one -> 'one'
stream-second -> 'second'
stream-one -> 'one'
stream-one -> 'one'
stream-second -> 'second'
stream-one -> 'one'
stream-second -> 'second'
stream-one -> 'one'
stream-second -> 'second'
stream-one -> 'one'
stream-second -> 'second'
stream-one -> 'one'
stream-one -> 'one'
stream-one -> 'one'
Unbiased	Select
Select	is	inherently	biased.	If	two	events	happen	at	the	same	time,	it	
will	select	the	Eirst	clause.
val repeats = 10_000
val p1 = producer("A", repeats)
val p2 = producer("B", repeats)
val p3 = producer("C", repeats)
val results = ConcurrentHashMap<String, Int>()
repeat(repeats) {
val result = select<String> {
p1.onReceive { it }
p2.onReceive { it }
p3.onReceive { it }
}
results.compute(result) { k, v ->
if (v == null) {
1
} else {
v + 1
}
}
}
println(results)
{A=8235, B=1620, C=145}
{A=7850, B=2062, C=88}
{A=7878, B=2002, C=120}
{A=8260, B=1648, C=92}
{A=7927, B=2011, C=62}
val repeats = 10_000
val p1 = producer("A", repeats)
val p2 = producer("B", repeats)
val p3 = producer("C", repeats)
val results = ConcurrentHashMap<String, Int>()
repeat(repeats) {
val result = selectUnbiased<String> {
p1.onReceive { it }
p2.onReceive { it }
p3.onReceive { it }
}
results.compute(result) { k, v ->
if (v == null) {
1
} else {
v + 1
}
}
}
println(results)
{A=3336, B=3327, C=3337}
{A=3330, B=3332, C=3338}
{A=3334, B=3333, C=3333}
{A=3334, B=3336, C=3330}
{A=3332, B=3335, C=3333}
Selecting	on	close
val p1 = produce {
repeat(10) {
send("A")
}
}
val p2 = produce {
repeat(5) {
send("B")
}
}
runBlocking {
repeat(15) {
val result = selectUnbiased<String> {
p1.onReceive {
it
}
p2.onReceive {
it
}
}
println(result)
}
}
Selecting	on	close
val p1 = produce {
repeat(10) {
send("A")
}
}
val p2 = produce {
repeat(5) {
send("B")
}
}
runBlocking {
repeat(15) {
val result = selectUnbiased<String> {
p1.onReceiveOrNull {
it
}
p2.onReceiveOrNull {
it
}
}
println(result)
}
}
Done	Channel
When	parent	objects	are		closed	and	they	don't	have	coroutine	objects	
which	stored	in	the	children	layer.
App
Scheduler
Jobs		Manager
List	Coroutines
Done	Channel
When	parent	objects	are		closed	and	they	don't	have	coroutine	objects	
which	stored	in	the	children	layer.
App
Scheduler
Jobs		Manager
List	Coroutines
Close	()
Close	()
Close	()
app.Close	()
Solution	1	
Add	the	close	
function		to	
every	object
Done	Channel
When	parent	objects	are		closed	and	they	don't	have	coroutine	objects	
which	stored	in	the	children	layer.
App
Scheduler
Jobs		Manager
List	Coroutines
Solution	2	
send	the	close	
signal	directly	to	
all	coroutines
Please	close	for	me	:	)
Done	Channel
suspend fun processJob(
streamOne: ReceiveChannel<String>,
streamSecond: ReceiveChannel<String>) {
while (true) {
selectUnbiased<Unit> {
streamOne.onReceive { value ->
println("stream-one -> '$value'")
}
streamSecond.onReceive { value ->
println("stream-second -> '$value'")
}
}
}
println("End")
}
suspend fun processJob(
streamOne: ReceiveChannel<String>,
streamSecond: ReceiveChannel<String>,
done: Channel<Boolean>
) {
var run = true
while (run) {
selectUnbiased<Unit> {
done.onReceive {
run = false
}
streamOne.onReceive { value ->
println("stream-one -> '$value'")
}
streamSecond.onReceive { value ->
println("stream-second -> '$value'")
}
}
}
println("End")
}
val done = Channel<Boolean>()
val streamOne = streamOne()
val streamSecond = streamSecond()
val job = launch {
processJob(streamOne, streamSecond, done)
}
delay(2000)
println("Stop the job")
done.send(true)
streamOne.cancel()
streamSecond.cancel()
Tee	channel
Sometimes	we	may	want	to	split	values	coming	in	from	a	channel	so	that	
you	can	send	them	off	into	two	separate	areas	of	your	codebase.	
	Example:	we	want	to	take	in	a	stream	of	user	commands	on	a	channel,	
send	them	to	something	that	executes	them,	and	also	send	them	to	
something	that	logs	the	commands	for	later	auditing.
suspend fun tee(
stream: ReceiveChannel<String>,
done: Channel<Boolean>
): Pair<ReceiveChannel<String>, ReceiveChannel<String>> {
val out1 = Channel<String>()
val out2 = Channel<String>()
launch {
var run = true
try {
while (run) {
done.poll()?.let {
run = false
} ?: stream.poll()?.let {
out1.send(it)
out2.send(it)
}
}
} finally {
out1.close()
out2.close()
}
}
return Pair(out1, out2)
}
Others
Fan-in	Fan-out	pattern	
OrDone	channel	
Bridge	channel	
Mutex	
....
Summary
- Coroutine	provides	the	concurrency.	
- We	compose	small	patterns	into	the	larger	one.	
- Reusable	and	composable.
Q&A

More Related Content

Similar to Concurrency pattern in Kotlin

Introduction to PowerShell
Introduction to PowerShellIntroduction to PowerShell
Introduction to PowerShellBoulos Dib
 
Back to the futures, actors and pipes: using Akka for large-scale data migration
Back to the futures, actors and pipes: using Akka for large-scale data migrationBack to the futures, actors and pipes: using Akka for large-scale data migration
Back to the futures, actors and pipes: using Akka for large-scale data migrationManuel Bernhardt
 
Pick up the low-hanging concurrency fruit
Pick up the low-hanging concurrency fruitPick up the low-hanging concurrency fruit
Pick up the low-hanging concurrency fruitVaclav Pech
 
Presto anatomy
Presto anatomyPresto anatomy
Presto anatomyDongmin Yu
 
Full Stack Reactive In Practice
Full Stack Reactive In PracticeFull Stack Reactive In Practice
Full Stack Reactive In PracticeLightbend
 
The Dom Scripting Toolkit J Query
The Dom Scripting Toolkit J QueryThe Dom Scripting Toolkit J Query
The Dom Scripting Toolkit J QueryQConLondon2008
 
Getting Reactive with Cycle.js and xstream
Getting Reactive with Cycle.js and xstreamGetting Reactive with Cycle.js and xstream
Getting Reactive with Cycle.js and xstreamSteve Lee
 
Andrii Dembitskyi "Events in our applications Event bus and distributed systems"
Andrii Dembitskyi "Events in our applications Event bus and distributed systems"Andrii Dembitskyi "Events in our applications Event bus and distributed systems"
Andrii Dembitskyi "Events in our applications Event bus and distributed systems"Fwdays
 
Advanced JS Deobfuscation
Advanced JS DeobfuscationAdvanced JS Deobfuscation
Advanced JS DeobfuscationMinded Security
 
Polyglot Persistence in the Real World: Cassandra + S3 + MapReduce
Polyglot Persistence in the Real World: Cassandra + S3 + MapReducePolyglot Persistence in the Real World: Cassandra + S3 + MapReduce
Polyglot Persistence in the Real World: Cassandra + S3 + MapReducethumbtacktech
 
Tues 115pm cassandra + s3 + hadoop = quick auditing and analytics_yazovskiy
Tues 115pm cassandra + s3 + hadoop = quick auditing and analytics_yazovskiyTues 115pm cassandra + s3 + hadoop = quick auditing and analytics_yazovskiy
Tues 115pm cassandra + s3 + hadoop = quick auditing and analytics_yazovskiyAnton Yazovskiy
 
Code is Cool - Products are Better
Code is Cool - Products are BetterCode is Cool - Products are Better
Code is Cool - Products are Betteraaronheckmann
 
Building a system for machine and event-oriented data - Velocity, Santa Clara...
Building a system for machine and event-oriented data - Velocity, Santa Clara...Building a system for machine and event-oriented data - Velocity, Santa Clara...
Building a system for machine and event-oriented data - Velocity, Santa Clara...Eric Sammer
 
Dynamic C++ ACCU 2013
Dynamic C++ ACCU 2013Dynamic C++ ACCU 2013
Dynamic C++ ACCU 2013aleks-f
 
[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기NAVER D2
 
Symfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il clienteSymfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il clienteLeonardo Proietti
 

Similar to Concurrency pattern in Kotlin (20)

Introduction to PowerShell
Introduction to PowerShellIntroduction to PowerShell
Introduction to PowerShell
 
Back to the futures, actors and pipes: using Akka for large-scale data migration
Back to the futures, actors and pipes: using Akka for large-scale data migrationBack to the futures, actors and pipes: using Akka for large-scale data migration
Back to the futures, actors and pipes: using Akka for large-scale data migration
 
Pick up the low-hanging concurrency fruit
Pick up the low-hanging concurrency fruitPick up the low-hanging concurrency fruit
Pick up the low-hanging concurrency fruit
 
Presto anatomy
Presto anatomyPresto anatomy
Presto anatomy
 
Java Annotations and Pre-processing
Java  Annotations and Pre-processingJava  Annotations and Pre-processing
Java Annotations and Pre-processing
 
Full Stack Reactive In Practice
Full Stack Reactive In PracticeFull Stack Reactive In Practice
Full Stack Reactive In Practice
 
Om nom nom nom
Om nom nom nomOm nom nom nom
Om nom nom nom
 
The Dom Scripting Toolkit J Query
The Dom Scripting Toolkit J QueryThe Dom Scripting Toolkit J Query
The Dom Scripting Toolkit J Query
 
Performance tests - it's a trap
Performance tests - it's a trapPerformance tests - it's a trap
Performance tests - it's a trap
 
Getting Reactive with Cycle.js and xstream
Getting Reactive with Cycle.js and xstreamGetting Reactive with Cycle.js and xstream
Getting Reactive with Cycle.js and xstream
 
Andrii Dembitskyi "Events in our applications Event bus and distributed systems"
Andrii Dembitskyi "Events in our applications Event bus and distributed systems"Andrii Dembitskyi "Events in our applications Event bus and distributed systems"
Andrii Dembitskyi "Events in our applications Event bus and distributed systems"
 
Advanced JS Deobfuscation
Advanced JS DeobfuscationAdvanced JS Deobfuscation
Advanced JS Deobfuscation
 
Polyglot Persistence in the Real World: Cassandra + S3 + MapReduce
Polyglot Persistence in the Real World: Cassandra + S3 + MapReducePolyglot Persistence in the Real World: Cassandra + S3 + MapReduce
Polyglot Persistence in the Real World: Cassandra + S3 + MapReduce
 
Tues 115pm cassandra + s3 + hadoop = quick auditing and analytics_yazovskiy
Tues 115pm cassandra + s3 + hadoop = quick auditing and analytics_yazovskiyTues 115pm cassandra + s3 + hadoop = quick auditing and analytics_yazovskiy
Tues 115pm cassandra + s3 + hadoop = quick auditing and analytics_yazovskiy
 
Code is Cool - Products are Better
Code is Cool - Products are BetterCode is Cool - Products are Better
Code is Cool - Products are Better
 
Building a system for machine and event-oriented data - Velocity, Santa Clara...
Building a system for machine and event-oriented data - Velocity, Santa Clara...Building a system for machine and event-oriented data - Velocity, Santa Clara...
Building a system for machine and event-oriented data - Velocity, Santa Clara...
 
Broadleaf Presents Thymeleaf
Broadleaf Presents ThymeleafBroadleaf Presents Thymeleaf
Broadleaf Presents Thymeleaf
 
Dynamic C++ ACCU 2013
Dynamic C++ ACCU 2013Dynamic C++ ACCU 2013
Dynamic C++ ACCU 2013
 
[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기
 
Symfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il clienteSymfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il cliente
 

More from Thao Huynh Quang

2021-03-08-telegram-vs-signal.pdf
2021-03-08-telegram-vs-signal.pdf2021-03-08-telegram-vs-signal.pdf
2021-03-08-telegram-vs-signal.pdfThao Huynh Quang
 
Consensus and Raft Algorithm in Distributed System
Consensus and  Raft Algorithm in Distributed SystemConsensus and  Raft Algorithm in Distributed System
Consensus and Raft Algorithm in Distributed SystemThao Huynh Quang
 
Consensus and Raft algorithm (Vietnamese version)
Consensus and Raft algorithm (Vietnamese version)Consensus and Raft algorithm (Vietnamese version)
Consensus and Raft algorithm (Vietnamese version)Thao Huynh Quang
 
Kotlin Introduction with Android applications
Kotlin Introduction with Android applicationsKotlin Introduction with Android applications
Kotlin Introduction with Android applicationsThao Huynh Quang
 
Git Introduction with illustrations
Git Introduction with illustrationsGit Introduction with illustrations
Git Introduction with illustrationsThao Huynh Quang
 
Android Jetpack: Room persistence library
Android Jetpack: Room persistence libraryAndroid Jetpack: Room persistence library
Android Jetpack: Room persistence libraryThao Huynh Quang
 
Kubernetes and service mesh application
Kubernetes  and service mesh applicationKubernetes  and service mesh application
Kubernetes and service mesh applicationThao Huynh Quang
 
Kafka: All an engineer needs to know
Kafka: All an engineer needs to knowKafka: All an engineer needs to know
Kafka: All an engineer needs to knowThao Huynh Quang
 
Observability and its application
Observability and its applicationObservability and its application
Observability and its applicationThao Huynh Quang
 
Android Reverse Engineering
Android Reverse EngineeringAndroid Reverse Engineering
Android Reverse EngineeringThao Huynh Quang
 

More from Thao Huynh Quang (16)

2021-03-08-telegram-vs-signal.pdf
2021-03-08-telegram-vs-signal.pdf2021-03-08-telegram-vs-signal.pdf
2021-03-08-telegram-vs-signal.pdf
 
Consensus and Raft Algorithm in Distributed System
Consensus and  Raft Algorithm in Distributed SystemConsensus and  Raft Algorithm in Distributed System
Consensus and Raft Algorithm in Distributed System
 
Consensus and Raft algorithm (Vietnamese version)
Consensus and Raft algorithm (Vietnamese version)Consensus and Raft algorithm (Vietnamese version)
Consensus and Raft algorithm (Vietnamese version)
 
Kotlin Introduction with Android applications
Kotlin Introduction with Android applicationsKotlin Introduction with Android applications
Kotlin Introduction with Android applications
 
Git Introduction with illustrations
Git Introduction with illustrationsGit Introduction with illustrations
Git Introduction with illustrations
 
Android Jetpack: Room persistence library
Android Jetpack: Room persistence libraryAndroid Jetpack: Room persistence library
Android Jetpack: Room persistence library
 
Android Performance Tips
Android Performance TipsAndroid Performance Tips
Android Performance Tips
 
Kubernetes and service mesh application
Kubernetes  and service mesh applicationKubernetes  and service mesh application
Kubernetes and service mesh application
 
Kafka: All an engineer needs to know
Kafka: All an engineer needs to knowKafka: All an engineer needs to know
Kafka: All an engineer needs to know
 
Blockchain introduction
Blockchain introductionBlockchain introduction
Blockchain introduction
 
Observability and its application
Observability and its applicationObservability and its application
Observability and its application
 
GraphQL in Android
GraphQL in AndroidGraphQL in Android
GraphQL in Android
 
Android GRPC
Android GRPCAndroid GRPC
Android GRPC
 
Android Reverse Engineering
Android Reverse EngineeringAndroid Reverse Engineering
Android Reverse Engineering
 
nosql
nosqlnosql
nosql
 
android deep linking
android deep linkingandroid deep linking
android deep linking
 

Recently uploaded

Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company OdishaBalasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odishasmiwainfosol
 
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsUnveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsAhmed Mohamed
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based projectAnoyGreter
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Velvetech LLC
 
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio, Inc.
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesŁukasz Chruściel
 
What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...Technogeeks
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...stazi3110
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityNeo4j
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)OPEN KNOWLEDGE GmbH
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Andreas Granig
 
Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Hr365.us smith
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaHanief Utama
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesPhilip Schwarz
 
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样umasea
 
SpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at RuntimeSpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at Runtimeandrehoraa
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureDinusha Kumarasiri
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWave PLM
 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEOrtus Solutions, Corp
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxTier1 app
 

Recently uploaded (20)

Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company OdishaBalasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
 
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsUnveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML Diagrams
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based project
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...
 
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New Features
 
What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered Sustainability
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024
 
Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief Utama
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a series
 
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
 
SpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at RuntimeSpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at Runtime
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with Azure
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need It
 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
 

Concurrency pattern in Kotlin