Elegant degradation during runtime in case of deadlock detection or race conditions are non existent in the world of programming languages, yet you can easily think them up (binding some sort of preference to a thread and let the most preferential thread break the lock - experimenting with sleeping a thread for a number of seconds if it seems to race - notifying an 'exception' thread in case of all of this)
It's easy to think them up, but they'd be wrong
:-). You can't just revoke one thread's lock arbitrarily. If you think you can, you haven't thought through the consequences: What happens next? The complexity isn't (just) a feature of the language in this case: concurrent programming is tricky.