Haciendo un hilo de seguridad POJO

Prashant Pandey:

Aquí está la clase:

@NotThreadSafe
public class MutableInteger {
    private int value;
    public int get() { return value;}
    public void set(int value) { this.value = value;} 
}

Aquí está el post-condición de que me han llegado con: El valor devuelto por get()es igual al valor establecido por el valor set()o 0.

Es fácil ver que el anterior post-condición no siempre será verdad. Tomar dos hilos A y B, por ejemplo. Establece un Supongamos valuea 5 y B lo establece en 8 después de eso. Haciendo una get()en hilo Un volvería 8. Debería haber regresado 5. Es una situación simple condición de carrera.

¿Cómo puedo hacer que este seguro para hilos de clase? En el libro de Java: concurrencia en la práctica , los autores han vigilado valuey tanto los métodos en el mismo objeto. No entiendo cómo esto ayuda en absoluto con la condición de carrera. En primer lugar, set()no es una acción compuesta. Así que, ¿por qué necesitamos para sincronizarlo? E incluso después de eso, la condición de carrera no desaparece. Tan pronto como se libera el bloqueo una vez que sale un hilo del set()método, otro hilo puede adquirir la cerradura y establecer un nuevo valor. Haciendo una get()en el hilo inicial devolverá el nuevo valor, violación de la post-condición.

(Entiendo que el autor es la vigilancia del get()) para la materia de visibilidad. Pero no estoy seguro de cómo se elimina la condición de carrera.

Michael Berry:

En primer lugar, set () no es una acción compuesta. Así que, ¿por qué necesitamos para sincronizarlo?

No está sincronizando el set()derecho propio, que está sincronizando ambos los get()y set()métodos contra el mismo objeto (suponiendo que realiza estos dos métodos sincronizados.)

Si no lo hace, y la valuevariable no está marcado como volátil, entonces no se puede garantizar que un hilo verá el valor correcto a causa de almacenamiento en caché para cada subproceso. (Tema apodría actualizar a 5, a continuación, el hilo bpodría potencialmente ver todavía 8 incluso después de hilo aha puesto al día. Eso es lo que se entiende por falta de seguridad de los subprocesos en este contexto).

Tiene razón de que todas las asignaciones de referencia son atómicos, por lo que no hay preocupación acerca de una referencia corrupta en este escenario.

E incluso después de eso, la condición de carrera no desaparece. Tan pronto como se libera el bloqueo una vez que sale un hilo a partir del método set (), otro hilo puede adquirir la cerradura y establecer un nuevo valor.

Nuevos temas nuevos objetos de valor (o nuevo código de establecimiento de nuevos valores) no es un problema en absoluto en términos de seguridad hilo - que está diseñado y esperado. La cuestión es si los resultados son inconsistentes, o específicamente si varios subprocesos son capaces de ver simultáneamente el objeto en un estado incoherente.

Supongo que te gusta

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