Recognize conditions that might prevent a thread from executing. Write code using synchronized wait, notify and notifyAll to protect against concurrent access problems and to communicate between threads.
Define the interaction among threads and object locks when executing synchronized wait, notify, or notifyAll.
Read Sections 9.4 "Synchronization" and Section 9.5 "Thread Transitions."
Various method calls and events may cause a thread to go from one state to another. Several conditions may prevent a thread from executing.
A good understanding of object locks and synchronized code is required. Note the difference between the notify() and notifyAll() methods.