package org.junit.internal.requests; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import org.junit.runner.Request; import org.junit.runner.Runner; abstract class MemoizingRequest extends Request { private final Lock runnerLock = new ReentrantLock(); private volatile Runner runner; @Override public final Runner getRunner() { if (runner == null) { runnerLock.lock(); try { if (runner == null) { runner = createRunner(); } } finally { runnerLock.unlock(); } } return runner; } /** Creates the {@link Runner} to return from {@link #getRunner()}. Called at most once. */ protected abstract Runner createRunner(); }