Threads Frage zu ReentrantLock

Lissy98

Mitglied
Hallo,
Ich habe ein Problem mit dem ReentrantLock und zwar beim unlock. In der Klasse Node wird der ReentrantLock deklariert und initialisiert und in einer anderen Klasse gibt es dann eine ArrayList mit lauter Nodes, so dass jeder Node ja sein "eigenes" Lock haben müsste. Ich will jetzt alle Nodes dieser ArrayList sperren, also lock auf den eigenen ReentrantLocks ausführen mithilfe einer for-each Schleife:

Java:
for (Node n : nachbar){
n.reentrant.lock();}

Danach den kritischen Code ausführen, und dann wieder in einer for-each Schleife, alle wieder entsperren, also unlock().
Ich bekomme jedoch bei dem unlock eine java.lang.IllegalMonitorStateException. Durch Print-Augaben habe ich jetzt schon herausgefunden, des der Lock nicht mehr vom aktuell ausführenden Thread gehalten wird. Ich denke Java löscht irgendwie alle Locks sobald } kommt- Kann das sein? Und gibt es eine Möglichkeit das zu verhindern? Bzw. irgendjemand ne Idee wie ich alle mit lock sperren kann ohne Schleife?

Liebe Grüße 🙂
 
Okay 🙂 Also von der Klasse Node:
Code:
public class Node {
   public ReentrantLock reentrant = new ReentrantLock();
.... }

und in der "Thread-Klasse":
Code:
public class MeinThread implements Runnable{
ArrayList<Node> knoten;
       
       
       
        public MeinThread (ArrayList<Node> nodes){
            knoten = nodes;
           
        }
        @Override
        public void run() {
//alle relevanten Knoten(im Kpnstruktor übergeben) "sperren"
for (Node n : knoten) {
n.reentrant.lock();}

// ....
//Knoten bearbeiten
//....

for (Node n: knoten) {
n.reentrant.unlock(); // hier:  java.lang.IllegalMonitorStateException
    at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(Unknown Source)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(Unknown Source)
    at java.util.concurrent.locks.ReentrantLock.unlock(Unknown Source)
}

Und ich weiß nicht obs relevant ist aber meine Threads werden von einem ExecutorService verwaltet.
Liebe Grüße 🙂
 
Sind die Schleifen in einer Methode?
Wie sieht dein ExceptionHandling zwischen lock und unlock aus?
Welche Threads greifen auf die Liste zu?

Java entsperrt da nicht einfach irgendwas von allein
 

Neue Themen


Zurück
Oben