This one had me stumped for a bit until I realized your problem!
Boolean types are immutable. You can't change their state.
When you write
isLocked = Boolean.FAlSE;
or
isLocked = Boolean.TRUE;
you are not changing the state of the object, you are assigning a completely different object to the reference.
This becomes an issue in your unlock() method:
You are synchronizing on one Boolean object, then the first thing you do is change the isLocked variable to contain a reference to a completely
different Boolean object, which you do NOT have a lock on!
That's why you get the IllegalMonitorState when you call notifyAll(). You're calling it on a different object than you synchronized on.
Hope this helps!
Rob