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;
}