User 1 moves X from A to B User 2 moves A.getParent() from A.getParent().getParent() to C A is read locked, B is read locked X write locked A.getParent() is write locked A.getParent().getParent() is read locked C is read locked For some reason, user 2's request is faster: A.getParent() is moved User 2's request is gets now processed further G2 tries to move X but it's file location is no longer valid because X.getParent().getParent() has been moved