does wait() relinquish currently executing object's lock ?
the thread calling wait() does not need the lock of the currently executing object but needs the lock of the object whichs wait()-method it is calling.
Here sync2() can be excecuted only by calling sync(), where the thread gets o1's Lock. direct calling of sync() results in java.lang.IllegalMonitorStateException