I agree about
Java Concurrency in Practice, after reading it you will have a great understanding of possible race conditions, available classes and some of the
patterns you can use in Java.
After that, you can study others people code, try to modify it or even rewrite. For a quick exercise check this:
http://korhner.github.io/java/multithreading/java-multithreading-expensive-pool/
It's an example of how we can quickly implement a complex multithreaded pattern with Java concurrent classes, you could implement the same using different approaches (low level locks, other concurrent classes).