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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top