public class Barrier { final int NBR_ELEMENTS = 4; final int NBR_ITERATIONS = 30; int[] data = new int[NBR_ELEMENTS]; /** * @param args */ public static void main(String[] args) { Barrier barrier = new Barrier(); barrier.initializeData(); barrier.testBarrier(); //barrier.showData(); // TODO Auto-generated method stub } public void testBarrier() { for (int i = 0; i < NBR_ELEMENTS; ++i) { final int I = i; Thread t = new Thread() { public void run() { for (int j = 0; j < NBR_ITERATIONS; ++j) { data[I] = data[I] + 1; barrier(); } } }; t.start(); } } public void initializeData() { for (int i = 0; i < NBR_ELEMENTS; ++i) data[i] = i; } public void showData() { for (int i = 0; i < NBR_ELEMENTS; ++i) System.out.print(data[i]+" "); System.out.println(); } int nbrWaiting = 0; synchronized void barrier() { nbrWaiting++; if (nbrWaiting == NBR_ELEMENTS) { showData(); nbrWaiting = 0; notifyAll(); } else { try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }