Tengo el siguiente fragmento de código.

synchronized (mObject) {
    if (mObject.variable != -1) {
        doThis();
        doThisAsWell();
        andThis();
        insertObjectInDb(); // This is crashing because mObject.variable is -1
    }
}

Que yo sepa, si uso sincronizado en un objeto y luego ejecuto ese bloque, el valor de la variable no puede ser cambiado por ningún otro hilo, ¿verdad? No entiendo cómo el valor de la variable es -1, cuando lo verifico específicamente antes de ingresar al siguiente bloque. Y no, ninguna de las funciones del bloque está cambiando el valor. ¿He entendido completamente mal cómo funcionan estos bloques?

Si importa, todo esto está en un método doInBackground () de una tarea asíncrona en una aplicación de Android.

¿Alguna idea?

3
Akhil Cherian Verghese 12 feb. 2015 a las 15:17

3 respuestas

La mejor respuesta

Que yo sepa, si uso sincronizado en un objeto y luego ejecuto ese bloque, el valor de la variable no puede ser cambiado por ningún otro hilo, ¿verdad?

No, tu suposición es incorrecta. synchronized es un monitor. La única garantía que tiene es que un hilo a la vez accede al monitor.

6
Blackbelt 12 feb. 2015 a las 12:20

Afaik sincronizado solo dice que cualquier acceso a mObject es seguro para subprocesos significa que el siguiente código garantizaría el conjunto i en 3 si se llama en 3 subprocesos

int i=0;
synchronized(i){
   i = i + 1;
}

Lo que quieres usar es un mutex

0
Verim 12 feb. 2015 a las 12:23

En este caso, el objeto "mObject" no se bloquea, sino que el objeto "mObject" se utiliza como mutex y se impide que el cuerpo se ejecute simultáneamente con otras secciones de código también sincronizadas en "mObject". No tiene ningún efecto en otros campos / métodos de "mObject" que no están sincronizados.

Encontré algunos detalles aquí: ¿Bloqueo del método sincronizado de Java en el objeto o método? < / a> Vea el comentario superior sobre esto.

1
Community 23 may. 2017 a las 12:06