long () { // read id before myNode to avoid returning changed id during concurrent dispose // (because myId is assigned before myNode in dispose) long id = myId; RangeMarkerTree.RMNode<?> node = myNode; if (node == null) { throw new IllegalStateException("Already disposed"); } return id; }