Pregunta

¿Hay alguna forma en Java de obtener un método para bloquear (mutex) el objeto en el que se encuentra?

Sé que esto suena confuso, pero básicamente no quiero un equivalente a este fragmento de C #, pero en Java.

lock(this)
{
    // Some code here...
}

Se me ha encomendado la tarea de volver a implementar una API escrita en .Net en Java, y se me ha pedido que mantenga la versión de Java tan similar a la versión de .Net como sea humanamente posible. Esto no se ve ayudado por el hecho de que la versión .Net parecía haberse transcrito de una versión de C ++ a la que no tengo acceso.

De todos modos, la línea anterior aparece en la versión C # y necesito algo que haga lo mismo en Java.

¿Fue útil?

Solución

El equivalente de eso es:

synchronized (this)
{
}

(Y no, generalmente no debería hacerlo en C # o Java. Prefiera bloquear las referencias privadas a las que nada más tiene acceso. Puede que ya lo sepa, por supuesto, pero no quería deja una respuesta sin la advertencia :)

Otros consejos

Suponiendo que el código C ++ es un simple mutex, reemplace " lock " con " sincronizado "

synchronized (this)
{
// ...
}

Aquí está el Tutorial de concurrencia de Java para obtener más información

Recomiendo Brian Goetz " Concurrencia de Java en la práctica . " Es un excelente libro.

Puede ser bueno mantener el bloque sincronizado lo más pequeño posible. El uso del modificador sincronizado en el método es de grano grueso y a veces es necesario, pero de lo contrario puede usar otro objeto para hacerlo que mantenga el bloque más pequeño.

Me gusta esto:

public class PrivateLock {
    private final Object myLock = new Object();
    @GuardedBy("myLock") Widget widget;

    void someMethod() {
        synchronized (myLock) {
            // Access or modify the state of widget
        }
    }
}

También debe buscar en el paquete java.util.concurrent de la API (JDK 5.0+) objetos de administración de concurrencia adicionales como semáforos, intercambiadores, etc.

http: / /java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top