ReentrantLock funktioniert nicht

Ich kann nicht herausfinden, warum der Code nicht richtig funktioniert. Das Problem ist, dass ReentrantLock den Methodenaufruf in ThreadClass.run () @ nicht sperr

Ressourcenklasse, für welche Methoden in ThreadClass eine Sperre angenommen wird

public class ResourceClass {

    private int i; 

    public void setIncrement() {
        i++;
    }

    public int getIncrement() {
        return i;
    }

}

Thread-Klasse

public class ThreadClass implements Runnable {

    private ResourceClass resource;
    private ReentrantLock reentrantLock = new ReentrantLock();

    ThreadClass(ResourceClass r) {
        resource = r;
    }

    public void run() {
        reentrantLock.lock();
        try {
            resource.setIncrement();
            System.out.println(resource.getIncrement());
        } finally {
            reentrantLock.unlock();
        }
    }

}

Hauptklass

public class MainClass {

    public static void main(String[] args) {

        ResourceClass resource = new ResourceClass();

        Thread thread = new Thread(new ThreadClass(resource));
        thread.start();
        Thread thread2 = new Thread(new ThreadClass(resource));
        thread2.start();
        Thread thread3 = new Thread(new ThreadClass(resource));
        thread3.start();
    }

} 

Es wird angenommen, dass der Code, der von lock in run () umgeben ist, "synchronisiert" werden muss, sodass nur ein Thread Zugriff auf die Methoden von Resourse-object hat. In der Praxis nicht. Der Code ergibt wiederholte Zahlen, was bedeutet, dass zwei Threads gleichzeitig auf die Methoden zugreifen können. Ich weiß, dass es wirklich ein einfaches Problem ist, aber ich kann nicht verstehen, wie ich es lösen soll. Danke für die Hilfe.

Aktualisieren

Ich habe das verstanden. Dieser Code funktioniert einwandfrei (ich habe setIncrement () gelöscht und die gesamte relevante Logik in getIncrement () eingefügt):

public int getIncrement() {
        reentrantLock.lock();
        int incrementResult = i++;
        reentrantLock.unlock();
        return incrementResult;
} 

Antworten auf die Frage(2)

Ihre Antwort auf die Frage