Synchronization Algorithms and Concurrent Programming by Gadi Taubenfeld