About Programming Java Threads in the Real World, Part 4
Programming Java Threads in the Real World, Part 4- A condition variable adds to wait the ability to not wait when the condition you're waiting for has already taken place; and a counting semaphore lets you control a pool of resources without sucking up machine cycles in polling loops.