Skip to content

Commit

Permalink
add chapter 10 notes for programming concurrency on the JVM
Browse files Browse the repository at this point in the history
  • Loading branch information
preslavmihaylov committed Sep 20, 2021
1 parent 08dc268 commit ec129d1
Showing 1 changed file with 58 additions and 0 deletions.
58 changes: 58 additions & 0 deletions java/programming-concurrency-jvm/chapter-10/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# Chapter 10: Zen of Programming Concurrency
Concurrency is not about the methods we call but about the approaches we take and the libraries we opt to use.

## Exercise Your Options
Among the most impactful decisions when dealing with concurrency is how to deal with state:
* Shared mutability
* Isolated mutability
* Immutability

Avoiding shared mutability will solve a lot of concurrency issues. Adapting to some of the other styles takes some effort but those efforts will soon pay back.

## Concurrency: Programmer's Guide
Upgrade to the modern Java concurrency API as a first step.

If you have to deal with shared mutable state:
* Make sure you use the modern tools the Java SDK provides.
* Make fields `final` wherever possible

If it's not possible to avoid mutability, at least transition to isolated mutability.
It's much easier to resolve concurrency issues by design than having to deal with them as they surface.

If you have frequent shared reads but not as frequent writes, the STM model can be quite useful.
Alternatively, use actors to achieve isolated mutability.

## Concurrency: Architect's Guide
Concurrency and performance are most likely issues you will have to deal with at some point.

It's much better to eliminate concurrency issues than having to deal with them.
You can achieve that by removing mutable state - design applications around immutable objects or at least isolated mutability.

To deal with performance issues coming from concurrent access, consider concurrent and persistent data structures.

Try to handle concurrency concerns with the language & concurrency model choice but make sure you're sold on this in order to convince your team as well.

## Choose Wisely
In the JVM world, we generally have three options:
* synchronize-and-suffer
* software transactional memory
* Actor-based concurrency

No one option provides a perfect solution for all applications.

Modern JDK Concurrency API:
* comes out of the box with the stdlib
* Easy to create & manage pools of threads
* Comes with a lot of concurrent data structures
* The main drawback of this API is that to use it effectively, we need to be aware of synchronization issues and how to avoid them

Software Transactional Memory:
* Lock-free programming as state is immutable and identities are mutated only within transactions
* Drawback #1 - we must ensure that the state is immutable
* Drawback #2 - we must ensure that code inside transactions is idempotent and has no side effects
* Drawback #3 - not suitable for write-heavy applications

The Actor-Based Model
* Removes synchronization issues by promoting isolated mutability
* Drawback #1 - communication between actors has to happen in messages
* hence, we need to avoid implementing "chatty" actors

0 comments on commit ec129d1

Please sign in to comment.