The outer synchronization on *syncLock* works together with the inner synchronization in each Runnables run() method. It ensures that no thread performs a spell check unless all threads are created and started, because all threads want to synchronize on *syncLock*, too. The *syncLock.notifyAll()* is useless (I think), because just something has to be done in the inner synchronized block to force all threads to wait there.

btw, the code is taken from the guy that originally filed the bug about threading issues on source forge (http://sourceforge.net/p/languagetool/bugs/157/). I'll simplify the code to use locks or wait/notify.