The lock is on object life cycle. If destroy is called during dispatch (e.g. and exception), the thread will deadlock (or get an exception?). Since the lock is only about the object life cycle, it doesn't really help the actions that are dispatched to be locked. The thread enforces only one action is called at a time and in order in the queue. Another option is that destroy is handled by the thread, which makes more sense from an ordering issue.