Ne, když zavoláte notify(), probudí se tím některé vlákno, které předtím na stejném objektu zavolalo wait(). Na zámky to ale nemá žádný vliv, zámek pořád drží vlákno, které zavolalo notify() (protože držení zámku je podmínkou volání notify()) a probuzené vlákno na tento zámek čeká. Přičemž to, že bylo vlákno probuzeno z wait() jej při čekání na zámek nijak neupřednostňuje před jinými vlákny čekajícími na tentýž zámek.
Pokud vlákno 2 předběhne vlákno 1 a zavolá notify() v okamžiku, kdy ještě nikdo nezavolal wait(), proběhne notify() na prázdno (nic neudělá, resp. vyšle zprávu k probuzení, která nikoho nezajímá, takže se zahodí). Vlákno 2 pak dokončí synchronizovaný blok, čímž uvolní zámek a může pokračovat vlákno 1. To získá zámek, začne provádět synchronizovaný blok, vyhodnotí podmínku a zjistí, že hodnota je nastavena, tudíž vůbec nevstoupí do cyklu a nevolá wait(). Rovnou vypíše "Predana hodnota", shodí příznak nastavení hodnoty a informuje případné čekající vlákno.
Na tomhle příkladu je vidět, že wait()/notify() má málo možností. Ten příklad bude fungovat, pokud máte jen dvě vlákna, jedno zapisující a jedno čtecí. Pokud budete mít víc vláken, může nastat třeba případ, že jedno vlákno čte, druhé čeká na čtení a třetí čeká na zápis. První vlákno přečte hodnotu a probudí některé z dalších dvou vláken - klidně to ale může být to druhé čtecí vlákno, které zjistí, že hodnota není nastavená a znovu se uspí. A pak už nikdo další nezavolá znovu notify(), takže ta tři vlákna budou čekat donekonečna. Přitom by stačilo probudit to třetí vlákno, které chce zapsat. Řešením je místo notify() použít notifyAll(), které probudí všechna vlákna. Ta vlákna, která chtějí číst, zjistí že není co, a znovu se uspí, a to zapisovací vlákno zapíše a zase probudí všechna čekající vlákna. Jak je vidět, je to lepší než předchozí případ (nedojde k uváznutí programu), ale není to efektivní, protože zbytečně probouzíte i vlákna, která stejně nebudou moci nic udělat. Ve skutečnosti tam totiž máte dvě podmínky - některá vlákna čekají na to, až bude hodnota nastavená (aby ji mohla přečíst), jiná vlákna čekají, až bude prázdná (aby tam mohla zapsat novou hodnotu). Když použijete zámky z java.util.concurrent.lock, můžete si k jednomu zámku navěsit kolik podmínek chcete a při změně stavu nějaké podmínky probudit jenom jedno vlákno, které čeká na splnění právě téhle podmínky.