Consentire a un metodo di bloccare il suo oggetto padre in Java
-
22-07-2019 - |
Domanda
Esiste un modo in Java per ottenere un metodo per bloccare (mutex) l'oggetto in cui si trova?
So che sembra confuso, ma fondamentalmente non voglio essere simile a questo frammento di C # ma in Java.
lock(this)
{
// Some code here...
}
Mi è stato assegnato il compito di reimplementare un'API scritta in .Net in Java, e mi è stato chiesto di mantenere la versione Java il più simile alla versione .Net il più umanamente possibile. Questo non è aiutato dal fatto che la versione .Net sembrava trascritta da una versione C ++ a cui non ho accesso.
Comunque la riga sopra appare nella versione C # e ho bisogno di qualcosa che faccia lo stesso in Java.
Soluzione
L'equivalente è:
synchronized (this)
{
}
(E no, generalmente non dovresti farlo in C # o Java. Preferisci bloccare i riferimenti privati ??a cui nient'altro ha accesso. Potresti esserne già al corrente, ovviamente - ma non volevo lasciare una risposta senza preavviso :)
Altri suggerimenti
Supponendo che il codice C ++ sia un semplice mutex, sostituisci " blocca " con " sincronizzato "
synchronized (this)
{
// ...
}
Ecco il Tutorial sulla concorrenza Java per maggiori informazioni
Consiglierei Brian Goetz's " Java Concurrency In Practice . " È un libro eccellente.
Può essere una buona cosa mantenere il blocco sincronizzato il più piccolo possibile. L'uso del modificatore sincronizzato sul metodo è a grana grossa e talvolta necessario, ma in caso contrario puoi usare un altro oggetto per farlo che mantiene il blocco più piccolo.
In questo modo:
public class PrivateLock {
private final Object myLock = new Object();
@GuardedBy("myLock") Widget widget;
void someMethod() {
synchronized (myLock) {
// Access or modify the state of widget
}
}
}
Dovresti anche esaminare il pacchetto java.util.concurrent dell'API (JDK 5.0+) per ulteriori oggetti di gestione della concorrenza come semaforo, scambiatore, ecc.
http: / /java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html