I understand that Thread.currentThread().yield()
is a notification to thread scheduler that it may assign cpu cycle to some other thread of same priority if any
Only wait methods of the Object class release the intrinsic lock of the current instance (the thread may have other locks acquired, they don't get released). Yield, sleep, join do not bother about locks. However, join is a little more special, you are guaranteed to see all the changes made by the thread you're waiting for to finish.