Zwei Methoden zueinander Thread-safe machen (Locken)

ortauq

Aktives Mitglied
Ich habe eine ganz grundlegende Frage:

Wie "locke" ich am besten zwei Methoden gegeneinander, sodass ich eine gewisse Thread-Sicherheit habe.


Also ich hätte am besten so, dass,
wenn eine der beiden Methoden läuft,
die andere warten muss, bis die erste Methode fertig ist.
Und bei umgekehrter Aufruf-Reihenfolge soll das natürlich auch gelten.


Code:
class MyClass{
      method1(){
            //Warte bis Methode 2 fertig ausgeführt wurde, falls diese gerade läuft

      }

      method2(){
            //Warte bis Methode 1 fertig ausgeführt wurde, falls diese gerade läuft

      }
}

So in etwa stelle ich mir das vor ^^
 
Ich sollte noch ergänzen, dass ich diese Situation mehrmals in meinem Programm habe. Also jeweils 2 Methoden, die gegeneinander gelockt werden sollen.
 
Ja, die sind in der selben klasse. Das ist ja das Problem ^^"
Dieses "synchronized" scheint mir alle methoden in meiner Klasse gegeneinander zu locken.

Ich will jedoch je 2 Methoden zueinander locken.
In C++ gab es dazu eine critical section. Da konnte man mein Problem einfach mit mehreren critical section objekten lösen.
 
ist in java auch so ... nur musst du in java diesen sync-block selbst definieren ... und als lock-objekt kann man alles nutzen was im scope liegt


//EDIT
auch wenn mir nicht wirklich klar wird wozu das dienen soll ... aber SO könnte man es auch umsetzen

Java:
public synchronized void doMethod(int m)
{
	switch(m)
	{
		case 1:
			method1();
			break;
		case 2:
			method2();
			break;
		case 3:
			method3();
			break;
		default:
			throw new IllegalArgumentException("wrong method");
	}
}

die methode doMethod(int) selbst ist durch synchronized an sich gelockt ... und kann daher immer nur von einem thread gecallt werden ...
 
Zuletzt bearbeitet:
Ich habe es jetzt folgendermaßen gelöst:

Code:
class MyClass{

private final Object mPair1ToSyncOn= new Object();


void method1{
        synchronized (mPair1ToSyncOn) {
			
	try{
	    	
              }catch(Exception e){
		
	}
    	
        }//unlock
}


void method2{
        synchronized (mPair1ToSyncOn) {
			
	try{
	    	
              }catch(Exception e){
		
	}
    	
        }//unlock
}



}


Kann man das so machen?
mPair1ToSyncOn wäre quasi mein Object, auf welches ich meine zwei methoden synchronisiere.
Für jedes weitere Methoden-Pärchen hätte ich ein weiteres Object.
 
Zuletzt bearbeitet:
Kann man das so machen?
mPair1ToSyncOn wäre quasi mein Object, auf welches ich meine zwei methoden synchronisiere.
Für jedes weitere Methoden-Pärchen hätte ich ein weiteres Object.
Ja genau so macht man das (wenn man mal davon absieht, dass dein Code nicht kompiliert).
Wenn du vorhast mehrere solcher "Päarchen" zu erstellen, solltest du dir sinnvollere Namen für die Monitor-Objekte überlegen. Denn irgendwann stehts du dann vor "mPair27ToSyncOn" und hast keinen Plan, wozu das Objekt jetzt der Monitor ist. Also: Sinnvolle Namensgebung!

@Sen-Mithrarin: Nicht dein Ernst, oder!? :autsch:
Natürlich kann man Dinge auch mit Konstukten lösen, die unflexibel und krytisch sind. Geht immer! Aber gerade wenn ein Anfänger eine Frage zu "synchronized" stellt (und eigentlich zu jedem anderen Zeitpunkt auch), würde ich von solchem Code dringend abraten. Und das Problem "irgendwie" zu lösen statt sich zu informieren, wie man es üblicher Weise löst, ist meines Erachtens eines der größten Probleme, die Programmierer sich machen können.
Von daher: 6, setzen! :noe:
 
Zuletzt bearbeitet:
@natac
ich muss erlich zugeben das ich persönlich keinen unterschied sehe ob ich mir eine switch-methode schreibe und diese synce ... oder ein hilfs-objekt nehme und auf dieses synce ... der effekt bleibt gleich : es kann nur ein thread gleichzeitig den gelockten bereich betreten

ich lass mich aber über unterschiede gerne aufklären
 

Zurück
Oben