In this chapter, we looked at concurrency and the problems that can arise in a multithreaded environment. We introduced and looked at the most common examples of coroutine usage. We also familiarized ourselves with patterns, such as thread pools and callbacks, and how to use them. Furthermore, we covered synchronous and asynchronous programming, and the problems related to these topics.
In the next chapter, we will look at an overview of reactive programming, which is useful when we want to process asynchronous actions.