Your threadLocal prevents a thread from unlocking a lock taken by a different thread. That's not good, as there are legitimate uses for this scenario (some producer-consumer).
What I also dislike is silently ignoring the unlock request. If it's forbidden, then it should probably throw.
Anyway, you can what you did without any thread local just by using AtomicReference<Thread> (with the content being the locking thread, or null, if it's free).
//To change body of catch statement use File | Settings | File Templates.
Should I?