public void run() { do { synchronized (values) { incrementCount(); values[getCount()]++; } try { Thread.sleep(1); } catch (InterruptedException e) { } } while (getCount() < 100); } Почему метод не работает, по логике вещей, пока нить не выполнит увеличение incrementCount() и не запишет values[getCount()]++; остальные нити будут ждать.