import java.util.concurrent.Semaphore; class Table { private int numForks; private Semaphore[] forks; public Table(int numForks) { this.numForks = numForks; this.forks = new Semaphore[numForks]; for (int i = 0; i < this.numForks; i++) { this.forks[i] = new Semaphore(1); } } public void takeForks(int i) throws InterruptedException { int left = i; int right = (i + 1) % numForks; if (right > left) { forks[left].acquire(); forks[right].acquire(); } else { forks[right].acquire(); forks[left].acquire(); } } public void returnForks(int i) { forks[i].release(); forks[(i + 1) % numForks].release(); } }