threads and java memory model explained
TRANSCRIPT
![Page 2: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/2.jpg)
SOME QUOTES I HEARD IN MY CAREER
![Page 3: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/3.jpg)
“DEAD LOCK ON 300 THREADS. CAN ANYBODY HELP ME?”
Soft real time developer
![Page 4: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/4.jpg)
“IN PARALLEL IT IS WORSE.” // GLOBAL LOCK ON A HUGE GRAPH
Myself struggling to fix a performance issue
![Page 5: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/5.jpg)
“LET’S NOT USE THREADS, IT ALWAYS GIVES US TROUBLE.”
Architect with 15 years of experience
![Page 6: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/6.jpg)
“MY CODE WORKS.” // NO SYNCHRONISATION, ONLY THREADS
Lead Programmer
![Page 7: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/7.jpg)
DOING MANY THINGS AT ONCE? A FEW THINGS YOU SHOULD KNOW…
![Page 8: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/8.jpg)
VOCABULARY
![Page 9: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/9.jpg)
DEFINITION ON YOUR FAVOURITE SEARCH ENGINE
![Page 10: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/10.jpg)
DEFINITION ON YOUR FAVOURITE SEARCH ENGINE
![Page 11: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/11.jpg)
DEFINITION ON YOUR FAVOURITE SEARCH ENGINE
![Page 12: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/12.jpg)
DEFINITION ON YOUR FAVOURITE SEARCH ENGINE
![Page 13: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/13.jpg)
PARALLEL != CONCURRENT
![Page 14: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/14.jpg)
DEFINITION ON YOUR FAVOURITE SEARCH ENGINE
![Page 15: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/15.jpg)
PARALLEL DON'T DISPUTE, CONCURRENT MAY DISPUTE.
![Page 16: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/16.jpg)
DEFINITION ON YOUR FAVOURITE SEARCH ENGINE
X
![Page 17: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/17.jpg)
DEFINITION ON YOUR FAVOURITE SEARCH ENGINE
![Page 18: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/18.jpg)
DEFINITION ON YOUR FAVOURITE SEARCH ENGINE
![Page 19: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/19.jpg)
PARALLELISM WON’T IMPROVE LATENCY.
![Page 20: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/20.jpg)
PARALLELISM MAY IMPROVE THROUGHPUT.
![Page 21: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/21.jpg)
JSR 133 JAVA MEMORY MODEL
![Page 22: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/22.jpg)
![Page 23: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/23.jpg)
![Page 24: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/24.jpg)
![Page 25: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/25.jpg)
![Page 26: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/26.jpg)
![Page 27: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/27.jpg)
![Page 28: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/28.jpg)
![Page 29: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/29.jpg)
![Page 30: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/30.jpg)
![Page 31: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/31.jpg)
RACE CONDITION THE CLASSIC SAMPLE
![Page 32: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/32.jpg)
RACE CONDITION
▸ definition: shared resources may get used “at the same time” by different threads, resulting in a invalid state.
▸ motivation: any need of concurrent or parallel processing.
▸ how to avoid: usage of some mechanism to ensure resources are used by only one thread at a time or even share nothing.
![Page 33: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/33.jpg)
thread 1 thread 2
VAR=0
![Page 34: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/34.jpg)
thread 1 thread 2
VAR=0
VAR++ VAR++
![Page 35: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/35.jpg)
thread 1 thread 2
VAR=0
VAR++ VAR++
VAR=1
Clearly not the expected result. There are code in production working with those errors for years without people realising it.
VAR WAS NOT SYNCHRONISED PROPERLY
![Page 36: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/36.jpg)
AVOIDING OR FIXING THIS RACE CONDITION
▸ let the database deal with it (just kidding, but sadly it seems to be the standard way of doing it).
▸ correct synchronisation by using locks.
▸ usage of concurrent classes, such as AtomicLong.
▸ one counter per thread (summing them still requires synchronisation).
▸ share nothing.
▸ any other suggestion?
![Page 37: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/37.jpg)
thread 1 thread 2
VAR=0LOCK
![Page 38: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/38.jpg)
thread 1 thread 2
VAR=0LOCK
LOCK
VAR++ WAITING LOCK
![Page 39: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/39.jpg)
thread 1 thread 2
VAR=0LOCK
VAR++
LOCK
VAR++
![Page 40: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/40.jpg)
thread 1 thread 2
VAR=0LOCK
VAR++
VAR++
VAR=2
The result was as expected, but there was a penalty in the time it took to perform both operations. In order to minimise it avoid sharing in the first place.
VAR WAS PROPERLY SYNCHRONISED
![Page 41: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/41.jpg)
READS ALSO NEEDS SYNCHRONISATION // COMMON MISTAKE IS ONLY // SYNCHRONISE WRITES.
![Page 42: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/42.jpg)
![Page 43: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/43.jpg)
![Page 44: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/44.jpg)
![Page 45: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/45.jpg)
![Page 46: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/46.jpg)
![Page 47: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/47.jpg)
LESSONS
▸ Synchronise properly. High level APIs are easier not to mess with. java.util.concurrent excels at that.
▸ The optimal number of threads is usually twice the number of cores: Runtime.getRuntime().availableProcessors() * 2;
▸ Measure and stress. It is not easy to see synchronisation issues, since the behaviour varies depending on machine, operation system, etc. They usually don’t show while debugging.
![Page 48: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/48.jpg)
DEAD LOCK SOMETIMES NEVER ENDS
![Page 49: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/49.jpg)
DEAD LOCKS
▸ what it is: threads holding and waiting each other locks.
▸ motivation: global lock leads to global contention and slow code. Use of more than one fine grained lock at the same time in more than one thread in a unpredictable way is the real problem.
▸ how to avoid: ensure same locking order or review synchronisation strategy (functional approach, atomic classes, high level APIs, concurrent collections, share nothing, etc).
![Page 50: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/50.jpg)
thread 1 thread 2
AB
Two threads have access to resources protected by two distinct locks: A and B.
Green means available, yellow means waiting and red means locked.
Two scenarios are going to be presented: Threads acquiring the locks in the same order, and in different order.
![Page 51: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/51.jpg)
thread 1 thread 2
B A First thread acquires lock A.
![Page 52: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/52.jpg)
thread 1 thread 2
B A A
Second thread tries to acquire the same lock. Since it is in use, it will wait until lock A is available.
![Page 53: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/53.jpg)
thread 1 thread 2
A A
B
Meanwhile the first thread acquires lock B. The second thread is still waiting for lock A.
![Page 54: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/54.jpg)
thread 1 thread 2
B A AThe first thread releases lock B. The second thread is still waiting for lock A.
![Page 55: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/55.jpg)
thread 1 thread 2
AB AThen the lock A is finally released. The second thread is finally able to use it.
![Page 56: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/56.jpg)
thread 1 thread 2
B A It acquires lock A.
![Page 57: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/57.jpg)
thread 1 thread 2
A
B
Then it acquires lock B.
![Page 58: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/58.jpg)
thread 1 thread 2
B A Lock B is released.
![Page 59: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/59.jpg)
thread 1 thread 2
AB
Then lock A is released. No synchronisation problems has happened and no locked resources where harmed in this execution. Some contention has happened, but they where temporary.
EVERYTHING WAS FINE.
![Page 60: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/60.jpg)
thread 1 thread 2
AB NOW SOMETHING DIFFERENT
![Page 61: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/61.jpg)
thread 1 thread 2
B AThe first thread acquires lock A.
![Page 62: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/62.jpg)
thread 1 thread 2
A BAnd the second thread acquires lock B.
![Page 63: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/63.jpg)
thread 1 thread 2
A B
B
The first thread tries to acquire lock B. Since it is busy, it will wait for it.
![Page 64: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/64.jpg)
thread 1 thread 2
A B
B A
And the second thread tries to acquire lock A. Since it is busy, it will wait for it.
![Page 65: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/65.jpg)
thread 1 thread 2
A B
B A
What did the different order of lock acquisition cause?
Keep in mind locks can be acquired internally by APIs, by using the synchronised keyword, by doing IO. It is almost impossible to keep track of all the locks in a huge application stack.
DEAD LOCK IS SET.
![Page 66: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/66.jpg)
![Page 67: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/67.jpg)
![Page 68: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/68.jpg)
LESSONS
▸ If sharing data between threads, synchronise properly and measure and stress (same as before).
▸ Keep in mind some dead locks keeps latent and may happen only in unusual situations (such as unusual high peak load).
▸ The best approach is to minimise sharing data, having isolated threads working independently.
▸ There are frameworks that suits better than using threads manually. Consider those, such as Akka, Disruptor, etc.
![Page 69: Threads and Java Memory Model Explained](https://reader031.vdocuments.net/reader031/viewer/2022021813/58754dea1a28abb8208b7ccd/html5/thumbnails/69.jpg)
QUESTIONS? THANKS FOR YOUR TIME!
▸ https://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html
▸ http://docs.oracle.com/javase/specs/
▸ fotos: Dani Teston