Concurrency Coordination Reports
Latch Checkpoint Coordination Report
Count arrivals down on a checkpoint latch and report whether it has opened.
countdown latch
A `CountDownLatch` starts at a fixed count and opens when enough workers have arrived, so its remaining count is a clear coordination checkpoint.
Latch Checkpoint Coordination Report
LatchCheckpointCoordinationReport.java
Replay: real traced execution (multi-file project)
import java.util.concurrent.CountDownLatch;
public class LatchCheckpointCoordinationReport {
public static void main(String[] args) {
int arrivals = 2;
CountDownLatch latch = new CountDownLatch(3);
for (int i = 0; i < arrivals; i++) {
latch.countDown();
}
long remaining = latch.getCount();
String status = remaining == 0 ? "open" : remaining <= 1 ? "ready" : "wait";
System.out.println("arrivals=" + arrivals + " remaining=" + remaining + " status=" + status);
}
}
import java.util.concurrent.CountDownLatch;
public class LatchCheckpointCoordinationReport {
public static void main(String[] args) {
int arrivals = 0;
CountDownLatch latch = new CountDownLatch(3);
for (int i = 0; i < arrivals; i++) {
latch.countDown();
}
long remaining = latch.getCount();
String status = remaining == 0 ? "open" : remaining <= 1 ? "ready" : "wait";
System.out.println("arrivals=" + arrivals + " remaining=" + remaining + " status=" + status);
}
}
import java.util.concurrent.CountDownLatch;
public class LatchCheckpointCoordinationReport {
public static void main(String[] args) {
int arrivals = 3;
CountDownLatch latch = new CountDownLatch(3);
for (int i = 0; i < arrivals; i++) {
latch.countDown();
}
long remaining = latch.getCount();
String status = remaining == 0 ? "open" : remaining <= 1 ? "ready" : "wait";
System.out.println("arrivals=" + arrivals + " remaining=" + remaining + " status=" + status);
}
}
arrivals ← 2, latch ← ⟨CountDownLatch A⟩[Count = 3]
3public class LatchCheckpointCoordinationReport {4 public static void main(String[] args) {5 int arrivals→ 2 = 2; //@arrivals=0, 36 CountDownLatch latch→ ⟨CountDownLatch A⟩[Count = 3] = new CountDownLatch(3);for (int i = 0; i < arrivals; i++)
pass 1 of 28for (int i0 = 0; i < arrivals2; i++) {9 latch.countDown();10}for (int i = 0; i < arrivals; i++)
pass 2 of 28for (int i1 = 0; i < arrivals2; i++) {9 latch.countDown();10}remaining ← 1, status ← ready
12 long remaining→ 1 = latch.getCount();13 String status→ ready = remaining1 == 0 ? "open" : remaining <= 1 ? "ready" : "wait";1415 System.out.println("arrivals=" + arrivals2 + " remaining=" + remaining1 + " status=" + statusready);16}outputarrivals=2 remaining=1 status=ready
arrivals ← 0, latch ← ⟨CountDownLatch A⟩[Count = 3], remaining ← 3
3public class LatchCheckpointCoordinationReport {4 public static void main(String[] args) {5 int arrivals→ 0 = 0;6 CountDownLatch latch→ ⟨CountDownLatch A⟩[Count = 3] = new CountDownLatch(3);78 for (int i = 0; i < arrivals; i++) {9 latch.countDown();10 }1112 long remaining→ 3 = latch.getCount();13 String status→ wait = remaining3 == 0 ? "open" : remaining <= 1 ? "ready" : "wait";1415 System.out.println("arrivals=" + arrivals0 + " remaining=" + remaining3 + " status=" + statuswait);16 }outputarrivals=0 remaining=3 status=wait
arrivals ← 3, latch ← ⟨CountDownLatch A⟩[Count = 3]
3public class LatchCheckpointCoordinationReport {4 public static void main(String[] args) {5 int arrivals→ 3 = 3;6 CountDownLatch latch→ ⟨CountDownLatch A⟩[Count = 3] = new CountDownLatch(3);for (int i = 0; i < arrivals; i++)
pass 1 of 38for (int i0 = 0; i < arrivals3; i++) {9 latch.countDown();10}All 3 passes — pass 1 is the card above pass i1 0 2 1 3 2 remaining ← 0, status ← open
12 long remaining→ 0 = latch.getCount();13 String status→ open = remaining0 == 0 ? "open" : remaining <= 1 ? "ready" : "wait";1415 System.out.println("arrivals=" + arrivals3 + " remaining=" + remaining0 + " status=" + statusopen);16}outputarrivals=3 remaining=0 status=open