I seem to have missed looking at this but here's my late comments on the patch:
1) waitingThreads isn't synchronized everywhere which may lead to stale values being used. For maximum concurrency it might also be better to use an AtomicInteger instead of lock + sync block. This also solves the "stale" issue.
2) I think the class has effectively become a singleton now, with the static Thread design (only the first instance will be monitored by the thread). We should allow multiple instances of load monitors in the same class loader.
Based on these first two comments you may want to do some changes so I'll have a look again once that's done.
Best regards
Mike
I've got a fix for this issue, but I will need to create some automated tests before I submit the patch.