Pregunta

Esto es lo que mi código se ve actualmente como:

private boolean[] isInitialized = new boolean[COUNT];

private void ensureInitialized(int i) {
    if (! isInitialized[i]) {
        initialize(i);
        isInitialized[i] = true;
    }
}

Ahora quiero tener que subprocesos. Sé que una doble comprobación de bloqueo en Java es "teh 3vilness !! 1", pero desde ensureInitialized puede ser llamado muy a menudo, no quiero que sea sincronizado. Así que estoy pensando en hacer esto:

private boolean[] isInitialized = new boolean[COUNT];

private void ensureInitialized(int i) {
    if (! isInitialized[i]) {
        synchronized (this) {
            if (! isInitialized[i]) {
                initialize(i);
                isInitialized[i] = true;
            }
        }
    }
}

Ahora lo que tengo que hacer para que esto realmente hilo de seguridad?
Algunas preguntas secundarias:

  • Hacer isInitialized volátil no es necesario, ya que la variable no se cambia, ¿verdad?
  • Los elementos de la matriz se cambian, ¿cómo puedo hacer que los volátiles?
  • ¿Hay generalmente mejores maneras de hacer esto?

(Observe también que este es un método de instancia, inicializador de modo estático no de trabajo)

¿Fue útil?

Solución

Tenga en cuenta que la aplicación java de doble control se llama "patrón roto" porque fue comprobado como función (por ejemplo, véase http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html ). Para evitar sólo tiene que utilizar operación atómica. Seguimiento es muestra de la forma de rosca acumulación Singleton segura:

static AtomicReferenceArray<Boolean> instance = 
   new AtomicReferenceArray<Boolean>(COUNT);

private void ensure(int i)
{
    if(!instance.get(i) )
    {
        synchronized(this){
        if( !instance.get(i) ){
           initialize(i);
           instance.set(i, true);
        }
    }
}

Otros consejos

También podría considerar el uso de Suppliers.memoize(Supplier<T> delegate) biblioteca guayaba .

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