====== Ключевое слово synchronized, и как его использовать ====== import static java.lang.System.out; public class HelloWorld { private class State { private int state = 0; private final Object lock = new Object(); public void setState(int value) { synchronized (lock) { state = value; } } public int getState() { synchronized (lock) { return state; } } } public HelloWorld() { State st = new State(); try { asyncState(st); while (st.getState() < 1) { Thread.sleep(1000); out.println("tick"); } out.println("state set to 1"); } catch (InterruptedException err) { out.println(String.valueOf(err)); } } void asyncState(State state) { Thread th = new Thread(() -> { try { Thread.sleep(5000); state.setState(1); out.println("thread set state 1"); } catch (InterruptedException err) { out.println(String.valueOf(err)); } }); out.println("before thread start"); th.start(); out.println("after thread start"); } public static void main(String []args){ new HelloWorld(); } } Результат выполнения будет следующий. $javac HelloWorld.java $java -Xmx128M -Xms16M HelloWorld before thread start after thread start tick tick tick tick thread set state 1 tick state set to 1