I want to implement a mutex in Java using atomic variables. I tried implementing it using lamport bakery algorithm and it works. But I am not sure how to implement it, if I don't know the number of threads before.
Also, lamport algorithm keeps on increasing the labels and there is going to be an overflow, how to avoid this?
You want to build a, or use an existing, semaphore.
This has a better answer.
Creating a simple TTAS (test, test and set) spin-lock is fairly trivial:
class TTASLock {
private final AtomicLong thread = new AtomicLong();
void lock() {
while (true) {
if (thread.get() == 0) { // test
if (thread.compareAndSet(0, Thread.currentThread().getId())) // testAndSet
return;
}
}
}
void unlock() {
thread.compareAndSet(Thread.currentThread().getId(), 0)
}
}
This is a very simple spin-lock. The test, test and set paradigm is not strictly necessary from a logical pov, but is a critical performance improvement so that under contention a thread awaiting lock acquisition is not continually invalidating the Level2 cache line with failed CAS ops.