Ключевое слово 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