https://krishnakishorev.medium.com/java-multithreading-concurrency-and-parallelism-part-3-3566a4c208a8