and also refactor code making sure a thread won't grab two locks (which may cause deadlocks in some corner cases).