Se si desidera rendere il vostro metodo di processOutbox, è necessario utilizzare la parola chiave synchronized
:
public class YourClass{
public synchronized void processOutbox(){
//do all you want
}
}
Maggiori informazioni su: https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html
Se nel codice si dispone di un'istanza di YourClass chiamato ad esempio myInstance
, tutte le chiamate a processOutbox()
saranno thread-safe perché saranno bloccate a livello di istanza.
Ad esempio:
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();
Qui thead2 sarà in attesa fino a quando Thread1 termina la chiamata a "processOutbox"
Ma per esempio:
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 volontà NON attesa perché stanno chiamando il metodo su diverse istanze.
Qualcuno ha chiesto espressamente di usare ReentrantLock - Quindi sto aggiungendo quella risposta a questo, perché questo è corretto.
public class YourClass {
private Lock outboxLock = new ReentrantLock();
public void processOutbox() {
outboxLock.lock()
try {
// do stuff
} finally {
outboxLock.unlock()
}
}
}
Dico questo in particolare perché si può anche fare le cose, dove si tengono gli altri thread dalla serratura senza causare loro di bloccare utilizzando tryLock invece.
public class YourClass {
private Lock outboxLock = new ReentrantLock();
public void processOutbox() {
if(outboxLock.tryLock()) {
try {
// do stuff
} finally {
outboxLock.unlock()
}
}
}
}
fonte
2015-09-22 07:04:42
Hai bloccato solo la pianificazione. L'esecuzione non è ancora sicura. – Fildor
Come faccio allora? Per favore consiglio – mayooran
Suggerirei di sincronizzarlo sulla variabile statica di livello di classe. –