In the last chapter, we described several synchronization objects for multithreaded programming. For correct concurrent programs, multiple threads of execution must be synchronized to protect the integrity of shared data. In this chapter, we illustrate basic synchronization techniques using some classic concurrency problems of produ cer-consumer, bounded-buffer, and readers-writers. cer-consumer, bounded-buffer, and readers-writers.