Why do we need locks when a thread is waiting for an event from another thread?

This is rather a general question about low level internals of parallel computing, I guess.

Suppose I have two threads and one is waiting for another to finish some job. In Julia I can program it with Threads.Condition, use locks and wait on it. But why is it necessary? Why a thread can’t just “callback” scheduler that will continue the execution of another thread?
We don’t use locks to start an execution in a thread, then why it’s a problem to resume an execution?