Wenn Sie Ihre Methode processOutbox machen wollen, sollten Sie das Schlüsselwort synchronized
:
public class YourClass{
public synchronized void processOutbox(){
//do all you want
}
}
Mehr Infos unter: https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html
Wenn in Ihrem Code Sie haben eine Instanz von Yourclass genannt Zum Beispiel myInstance
, alle Aufrufe an processOutbox()
sind threadsicher, da sie auf Instanzenebene gesperrt werden.
Zum Beispiel:
YourClass myInstance = new YourClass();
Thread thread1 = new Thread(){
public void run(){
myInstance.processOutbox();
}
}
Thread thread2 = new Thread(){
public void run(){
myInstance.processOutbox();
}
}
thread1.start();
thread2.start();
Hier thead2 warten wird, bis thread1 den Anruf beendet zu "processOutbox"
Aber zum Beispiel:
YourClass myInstance = new YourClass();
YourClass myInstance2= new YourClass();
Thread thread1 = new Thread(){
@Override
public void run(){
myInstance.processOutbox();
}
};
Thread thread2 = new Thread(){
@Override
public void run(){
myInstance2.processOutbox();
}
}
thread1.start();
thread2.start();
thead2 wird NICHT warten, weil Sie rufen die Methode für verschiedene Instanzen auf.
Jemand fragte speziell nach der Verwendung von ReentrantLock - also füge ich diese Antwort zu diesem hier hinzu, weil dieser richtig ist.
public class YourClass {
private Lock outboxLock = new ReentrantLock();
public void processOutbox() {
outboxLock.lock()
try {
// do stuff
} finally {
outboxLock.unlock()
}
}
}
Ich erwähne dies ausdrücklich, weil man auch Dinge tun kann, wo man andere Themen halten aus dem Schloss ohne sie verursacht durch die Verwendung TryLock anstatt zu blockieren.
public class YourClass {
private Lock outboxLock = new ReentrantLock();
public void processOutbox() {
if(outboxLock.tryLock()) {
try {
// do stuff
} finally {
outboxLock.unlock()
}
}
}
}
Sie haben nur die Planung gesperrt. Die Ausführung ist immer noch nicht threadsicher. – Fildor
Wie mache ich es dann? Bitte um Rat. – mayooran
Ich würde vorschlagen, es auf statische Variable auf Klassenebene zu synchronisieren. –