Non ho capito molto bene come si gestisce la sincronizzazione tra piu thread: se ad esempio ho un blocco

codice:
synchronized(o) {
    //operazioni su o
}
cosa succede se questo blocco viene chiamato ma l'oggetto o e' bloccato da un altro thread2 che lo sta usando?

il thread1 rimane automaticamente in attesa fino allo sbloccarsi di o?

oppure questa situazione va gestita "a mano" con wait e notify varie?