Java Concurrency in Practice
This book joins Effective Java and Hibernate in Action as a "two copy" Java book -- it's such a must-have book that I need one copy at home and one copy at the office. This is an incredibly valuable book that is a required read for anyone hoping to create scalable web apps with Java.
Concurrency in Java is a very difficult, iceberg subject, and I guarantee your intution will fail you more often than not. The all-star authors (Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea) manage to make the book as readable as possible. Which is good, because this is not a reference book: it is a book that is meant to be read from cover to cover, multiple times. I found something to be embarassed about every few pages. Swallowing InterruptedExceptions? Oops. Communicating via state between threads via non-volatile variables? Ummm. Using synchronized HashMaps for local caches? Crap. There are a lot of bad habits I've discovered as a result of this book.
This book is also prompting me to move FeedBurner to JDK 1.5 (from JDK 1.4) sooner rather than later. While Doug Lea's concurrency library works well in JDK 1.4, the VM support for atomic variables in JDK 1.5 is reason enough for me. Well, there are a bunch of other reasons of course to move to JDK 1.5, but that's for another post.
Five stars, four thumbs up ... this is a must-read book for all serious Java developers.