void modify(P param, BiConsumer super P, ? super T> modifyConsumer) { synchronized (lock) { // modify rightState T rs = rightState; modifyConsumer.accept(param, rs); // swap left<->right state 1st T ls = leftState; rightState = ls; leftState = rs; // wait for rightReaders to complete EnterExitWait rr = rightReaders; rr.waitEmpty(); // swap left<->right readers 2nd EnterExitWait lr = leftReaders; rightReaders = lr; leftReaders = rr; // wait for ex-leftReaders (now-rightReaders) to complete lr.waitEmpty(); // modify ex-leftState (now-rightState) modifyConsumer.accept(param, ls); } } }