2010-01-27 30 views
7

lo que se entiende por vector en Java es seguro para subprocesos y sincronizado, cómo se hace seguro para subprocesos. Estoy viendo los detalles internos de la implementaciónSincronización en vectores en Java

Respuesta

4

Vector se considera "seguro para subprocesos" porque el acceso a las partes internas del Vector está sincronizado. Métodos como add(), get(), size(), etc., están sincronizados de forma tal que las modificaciones a la estructura interna del Vector y el acceso a esa estructura interna no pueden procesarse simultáneamente por hilos separados.

16

Se hace "thread-safe" por el mérito de todos sus métodos que se sincronizan (a través de la palabra clave sincronizada), vea OpenJDK source code.

Lo que hace la palabra clave sincronizada es que impide que más de un subproceso ejecute cualquiera de los métodos sincronizados al mismo tiempo. Está utilizando un bloqueo interno, que un hilo debe obtener al ingresar de esos métodos, y que el hilo se libera cuando abandona el método.

Tenga en cuenta que esto realmente no ayuda mucho, porque si bien evita el estado interno inconsistente del vector, esto de ninguna manera garantiza un nivel de coherencia en un nivel superior (un nivel útil para una aplicación).

Considere este ejemplo que demuestra que usted todavía tiene que utilizar la sincronización en el código de aplicación (por lo que es posible que tan bien ha utilizado el ArrayList no sincronizado):

// BROKEN CODE, needs external synchronization 
// only add an element if the vector is empty 
if(vector.isEmpty()) 
    vector.add(anElement); 
+0

+1 pero debe corregir "Lo que hace la palabra clave sincronizada es que impide que más de un subproceso ejecute el método al mismo tiempo". No es solo el acceso al método específico que está bloqueado. – Fredrik

+0

@Fredrik: Gracias. Traté de corregir la oración sin que se volviera demasiado compleja. Supongo que un enlace a una explicación más larga estaría en orden. – Thilo

+0

¿Lo hice bien, que en el código que proporcionó, el 'vector' podría haberse alterado (no estar vacío) antes de' vector.add (anElement); '? – soshial

0

Encuentre los extractos siguientes de API de Java

En primer lugar, no es posible intercalar dos invocaciones de métodos sincronizados en el mismo objeto. Cuando un hilo está ejecutando un método sincronizado para un objeto, todos los otros hilos que invocan métodos sincronizados para el mismo bloque de objetos (suspenden la ejecución) hasta que el primer hilo termina con el objeto.

En segundo lugar, cuando sale un método sincronizado, establece automáticamente una relación de pasar antes con cualquier invocación posterior de un método sincronizado para el mismo objeto. Esto garantiza que los cambios en el estado del objeto sean visibles para todos los hilos.

Cuestiones relacionadas