diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/SerializedExecutor.java b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/SerializedExecutor.java index c1828cff59f..30f0446469c 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/SerializedExecutor.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/SerializedExecutor.java @@ -37,17 +37,17 @@ import org.eclipse.jetty.util.log.Log; */ public class SerializedExecutor implements Executor { - private final AtomicReference _last = new AtomicReference<>(); + final AtomicReference _tail = new AtomicReference<>(); @Override public void execute(Runnable task) { Link link = new Link(task); - Link secondLast = _last.getAndSet(link); - if (secondLast==null) + Link lastButOne = _tail.getAndSet(link); + if (lastButOne==null) run(link); else - secondLast._next.lazySet(link); + lastButOne._next.lazySet(link); } protected void onError(Runnable task, Throwable t) @@ -57,7 +57,7 @@ public class SerializedExecutor implements Executor private void run(Link link) { - while(true) + while(link!=null) { try { @@ -69,10 +69,12 @@ public class SerializedExecutor implements Executor } finally { - // Are we are not the current last Link? - if (!_last.compareAndSet(link, null)) + // Are we the current the last Link? + if (_tail.compareAndSet(link, null)) + link = null; + else { - // continue running the list, but may need to wait for the next link + // not the last task, so its next link will eventually be set Link next = link._next.get(); while (next == null) { @@ -87,8 +89,8 @@ public class SerializedExecutor implements Executor private class Link { - private final Runnable _task; - private final AtomicReference _next = new AtomicReference<>(); + final Runnable _task; + final AtomicReference _next = new AtomicReference<>(); public Link(Runnable task) {