The concurrency utilities are actually the most important part of the Tiger multithreading support. In a previous posting I had a three-part strategy to access shared data from multiple threads:
1) Avoid the problem by using a thread-safe collection 2) Use synchronization (synchronized keyword or Lock/Condition) 3) Use volatile
The concurrency utilities provide the support for the first option.
For example, it is often possible to implement an algorithm so that some worker thread put their work on a queue, and other threads take the work off that queue. That way, objects are handed off safely, and the only shared object is the queue itself.
java.util.concurrent gives you threadsafe implementations of queues, maps, arrays, and priority queues that are a lot more sophisticated than what you learned in college. For example, according to the javadoc, LinkedQueue "employs an efficient "wait-free" algorithm based on one described in Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue Algorithms by Maged M. Michael and Michael L. Scott."
In addition, java.util.concurrent gives you implementations of a thread pool, so you don't have to reinvent that wheel. There are a few other goodies--see Core Java vol. 2 ch. 1.
Author of <a href="http://www.amazon.com/exec/obidos/ASIN/0131482025/ref=jranch-20" target="_blank" rel="nofollow">Core Java 2, Volume I - Fundamentals (7th Edition)</a>