After using threads for years, I'm still not sure I understand the best design patterns. I think I'm being too aggressive with synchronization.

What are the most up-to-date books on the subject? I own a copy of Doug Lea's Concurrent Programming in Java, published in 1999. Maybe I should read that again. He also co-authored Java Concurrency in Practice: Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea: 9780321349606: Books. Any others I should consider?