Developer's Reading List, October 23, 2012 New books on C++11, parallel programming, CoffeeScript, requirements, and more.
by Maurice Herlihy and Nir Shavit
I was the lead author on one of the early books on multithreaded programming, so I have some personal experience with the difficulties of explaining this particular domain. One of the great challenges is determining how many different domains to travel to explain how parallel operations work. The authors do a remarkably thorough job of this. After introducing all the standard concepts, they apply them to numerous data structures: linked lists, skiplists, queues of all kinds, and stacks. (Unfortunately, trees — which have their own unique concurrency issues — are not covered at all. Nonetheless, the principal feature of mutual exclusion in trees, hierarchical locks, is explained well.) The book also covers software transactional memory (STM), which is a topic often omitted in concurrency texts.
The explanations are lucid, interesting, and approachable. The supporting code is in Java, and an appendix discusses the necessary changes for C# and C. The code, however, is the Achilles' heel of this work. The first edition, before this revision appeared, contained numerous errors in code. While those have been corrected, the revised code still contains infelicities. Some code contains unused variables. Opposing coding conventions are used in various examples. Some code is heavily commented, other non-obvious code has no explanation. The downloadable files contain extraneous artifacts (like cvsignore files and the like). So while the text reveals care and clarity, the code shows a surprising lack of care, almost an impatience. For the explanations in this book, I can conditionally recommend it. However, if you want a book on parallel programming in Java, with fewer theoretical explanations but correct code, the definitive text is Java Concurrency in Practice by Brian Goetz et al.