Condición de carrera: Min y Max gama de un número entero

Anmol Singh Jaggi:

Hace poco me hice esta pregunta en una entrevista.

Dado el siguiente código, lo que será el min y el valor máximo posible del entero estática num?

import java.util.ArrayList;
import java.util.List;

public class ThreadTest {
    private static int num = 0;

    public static void foo() {
        for (int i = 0; i < 5; i++) {
            num++;
        }
    }

    public static void main(String[] args) throws Exception{
        List<Thread> threads = new ArrayList<Thread>();
        for (int i = 0; i < 5; i++) {
            Thread thread = new Thread(new Task());
            threads.add(thread);
            thread.start();
        }
        for (int i = 0; i < 5; i++) {
            threads.get(i).join();
        }
        // What will be the range of num ???
        System.out.println(ThreadTest.num);
    }
}

class Task implements Runnable {
    @Override
    public void run() {
        ThreadTest.foo();
    }

}

Les dije que el valor máximo sería de 25 (en caso de que no existe una condición de carrera), y sería min 5 (en caso de una condición de carrera entre todos los hilos en cada iteración).
Pero el entrevistador dijo que el valor del mínimo puede ir incluso por debajo de 5.
¿Cómo es posible?

Andy Turner:

Yo reclamo el valor mínimo posible es de 2.

La clave para esto es la no atomicidad de num++, es decir, es una lectura y una escritura, que puede tener otras operaciones en el medio.

Llame a la T1..T5 hilos:

  • T1 lee 0, T2 lee 0;
  • T1 escribe 1, y luego lee y escribe 3 veces.
  • Entonces T2 escribe 1;
  • Entonces T1 lee 1;
  • Entonces T2-5 hacer todo su trabajo
  • Entonces, finalmente, T1 escribe 2.

(Nota: el resultado 2 no depende ya sea en el número de hilos, o el número de iteraciones, siempre hay al menos 2 de cada uno).

Sin embargo, la respuesta honesta a esto es: lo que realmente no importa. Hay una carrera de datos, como se define en JLS 17.4.5 :

Cuando un programa contiene dos accesos en conflicto (§17.4.1 [ "dos accesos a (lee o escribe a) la misma variable se dice que están en conflicto si al menos uno de los accesos es una escritura."]) Que no se ordenó por un pasa-antes de la relación, se dice que contiene una  raza de datos .

(Hay una ausencia de pasa-antes de las relaciones entre las acciones de los hilos)

Así no se puede invocar de manera eficaz en lo que hace. Es simplemente un código incorrecto.

(Por otra parte, sé la respuesta a esto no debido a alguna batalla costado conseguir la depuración del código multiproceso o lectura técnica profunda: Lo sé porque he leído esta respuesta antes en otro lugar Es un truco de salón, nada más, y así. Pidiendo a la valor mínimo no es una muy buena pregunta de la entrevista).

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=305715&siteId=1
Recomendado
Clasificación