"The best theory is inspired by practice."
We have studied a plethora of different concurrency facilities in this book. By now, you will have learned about dozens of different ways of starting concurrent computations and accessing shared data. Knowing how to use different styles of concurrency is useful, but it might not yet be obvious when to use which.
The goal of this final chapter is to introduce the big picture of concurrent programming. We will study the use cases for various concurrency abstractions, see how to debug concurrent programs, and how to integrate different concurrency libraries in larger applications. In this chapter, we perform the following tasks:
Summarize the characteristics and typical uses of different concurrency frameworks introduced in the earlier chapters
Investigate how to deal with various kinds of bugs appearing in concurrent applications
Learn how to identify and resolve performance bottlenecks
Apply the previous...