Implementing a Peterson Lock in Java
Published on February 15, 2026
The Peterson Lock
class PetersonLock {
private volatile boolean[] flag = new boolean[2];
private volatile int victim;
public void lock() {
int i = ThreadID.get();
int j = 1 - i;
flag[i] = true;
victim = i;
while (flag[j] && victim == i) {};
}
public void unlock() {
int i = ThreadID.get();
flag[i] = false;
}
}
class ThreadID {
private static ThreadLocal<Integer> id = new ThreadLocal<>();
public static void set(int value) { id.set(value); }
public static int get() { return id.get(); }
}
class SharedCounter {
private int count = 0;
private PetersonLock lock = new PetersonLock();
public void increment() {
lock.lock();
try {
count++;
System.out.println("Thread " + ThreadID.get() + " incremented count to: " + count);
} finally {
lock.unlock();
}
}
}
public class Main {
public static void main(String[] args) {
SharedCounter counter = new SharedCounter();
Thread t0 = new Thread(() -> {
ThreadID.set(0);
for (int i = 0; i < 5; i++) {
counter.increment();
}
});
Thread t1 = new Thread(() -> {
ThreadID.set(1);
for (int i = 0; i < 5; i++) {
counter.increment();
}
});
t0.start();
t1.start();
}
}
class PetersonLock {
private boolean[] flag = new boolean[2];
private int victim;
public void lock() {
int i = ThreadID.get();
int j = 1 - i;
flag[i] = true;
victim = i;
while (flag[j] && victim == i) {};
}
public void unlock() {
int i = ThreadID.get();
flag[i] = false;
}
}
