2012-06-30 11 views

Respuesta

6

Para mí datos razas es un subconjunto de todas condiciones de carrera. Las carreras de datos ocurren cuando dos o más hilos acceden a la misma memoria sin un bloqueo adecuado que puede generar valores inesperados (si tiene al menos un hilo haciendo escrituras).

El término condición de carrera en general también podría referirse a, p. hilos que se estancan ocasionalmente debido a carreras en la programación de hilos (y uso inapropiado de mecanismos de bloqueo).

16

De acuerdo con Wikipedia, el término "condición de carrera" ha estado en uso desde los días de las primeras compuertas lógicas electrónicas. En el contexto de Java, una condición de carrera puede pertenecer a cualquier recurso, como un archivo, conexión de red, un hilo de un grupo de subprocesos, etc.

El término "raza de datos" se reserva mejor para su significado específico definido por el JLS.

El caso más interesante es una condición de carrera que es muy similar a una carrera de datos, pero todavía no es uno, como en este ejemplo sencillo:

class Race { 
    static volatile int i; 
    static int uniqueInt() { return i++; } 
} 

Desde i es volátil, no hay datos carrera; sin embargo, desde el punto de vista de la corrección del programa existe una condición de carrera debido a la falta de atomicidad de las dos operaciones: lea i, escriba i+1. Varios hilos pueden recibir el mismo valor de uniqueInt.

+0

se puede colocar en una línea en su respuesta que describe lo que significa 'datos race' realmente en JLS? – Geek

+0

@geek La palabra "JLS" es un hipervínculo a la sección correspondiente de JLS. –

74

No, no son lo mismo. No son un subconjunto el uno del otro. Tampoco son la condición necesaria ni suficiente para el otro.

La definición de raza de datos es bastante clara y, por lo tanto, su descubrimiento puede automatizarse. Se produce una carrera de datos cuando 2 instrucciones de diferentes subprocesos acceden a la misma ubicación de memoria, al menos uno de estos accesos es una escritura y no hay sincronización que obligue a a cualquier orden particular entre estos accesos.

Una condición de carrera es un error semántico. Es un defecto que ocurre en el tiempo o en el orden de los eventos que lleva a un comportamiento erróneo del programa. Muchas condiciones de carrera pueden ser causadas por carreras de datos, pero esto no es necesario.

Considérese el siguiente ejemplo sencillo donde x es una variable compartida:

Thread 1 Thread 2 

lock(l)  lock(l) 
x=1   x=2 
unlock(l) unlock(l) 

En este ejemplo, las escrituras en x de hilo 1 y 2 están protegidos por las cerraduras, por lo que siempre están sucediendo en algún orden forzada por el orden en que se adquieren los bloqueos en tiempo de ejecución. Es decir, la atomicidad de las escrituras no se puede romper; siempre hay un suceso antes de la relación entre los dos escribe en cualquier ejecución. Simplemente no podemos saber qué escritura sucede antes que la otra a priori.

No hay un pedido fijo entre las escrituras, porque los bloqueos no pueden proporcionar esto. Si la corrección de los programas está comprometida, digamos cuando la escritura en x por el hilo 2 es seguida por la escritura en x en el hilo 1, decimos que hay una condición de carrera, aunque técnicamente no existe una carrera de datos.

Es mucho más útil detectar condiciones de carrera que carreras de datos; sin embargo, esto también es muy difícil de lograr.

Construir el ejemplo inverso también es trivial. This publicación de blog también explica la diferencia muy bien, con un simple ejemplo de transacción bancaria.

+0

+1 para explicar 'sucede antes' – zencv

+0

" data race (...) no hay sincronización que obligue a un orden particular entre estos accesos. " Estoy un poco confundido. En su ejemplo, las operaciones pueden ocurrir en ambos pedidos (ya sea = 1, luego = 2, o al revés). ¿Por qué no es una carrera de datos? – josinalvo

+2

@josinalvo: es un artefacto de la definición técnica de una carrera de datos. El punto clave es que entre los dos accesos, habrá una liberación de bloqueo y una adquisición de bloqueo (para cualquiera de los posibles pedidos). Por definición, una liberación de bloqueo y una adquisición de bloqueo establece un orden entre los dos accesos y, por lo tanto, no hay carrera de datos. –

2

No, son diferentes & Ninguno de ellos es un subconjunto de uno o viceversa.

La condición de carrera término se confunde a menudo con el término datos relacionados carrera, que surge cuando la sincronización no se utiliza para coordinar todas acceso a un campo no final compartida. Se arriesga una carrera de datos cuando un subproceso escribe una variable que podría leerse próximamente por otro subproceso o lee una variable que podría haber sido escrita por última vez por otro subproceso si ambos subprocesos no usan sincronización; el código con razas de datos tiene ninguna semántica definida útil bajo el Modelo de memoria de Java. No todas las condiciones de la raza son carreras de datos, y no todas las carreras de datos son condiciones de carrera, , pero ambas pueden causar que los programas concurrentes fallen en formas impredecibles .

Tomado del libro excelente - Java concurrencia en la práctica por Joshua Bloch & Co.

Cuestiones relacionadas