2010-04-08 8 views
7

Las preguntas lo dicen todo, solo me pregunto, en una entrevista, qué dirías cuando te pregunten: "¿Qué significa prácticamente que Hashtable o Vectors estén sincronizados?"¿Qué significa cuando decimos que Hashtable o Vector está sincronizado?

+4

Me gustaría responder que significa que estás utilizando clases de casi una década sin una buena razón y en su lugar debes usar los equivalentes modernos del marco de recopilación. Sin embargo, eso está más allá del punto de la pregunta. – Esko

+0

¿Puede nombrar algunos equivalentes modernos – zengr

+1

'HashMap' y' ArrayList' respectivamente. – BalusC

Respuesta

14

Prácticamente esto significa dos cosas:

  1. no se utilicen a menos que se les va a compartir entre los hilos (si no sólo tiene que utilizar HashMap o ArrayList).
  2. Si los está compartiendo entre subprocesos, compruebe que las políticas de sincronización que implementan realmente son suficientes para hacer que su programa sea seguro (porque la existencia de alguna sincronización es una pequeña indicación del comportamiento simultáneo general de una clase).
+0

wow, esta es una buena explicación +1 – ant

7

significa que el acceso a la matriz/colección subyacente (añadir, obtener, configurar, poner, quitar, etc..etc ..) es todo sincronizado. No puede tener lugar simultáneamente. Prácticamente, todo el acceso se ha establecido en una cola FIFO (primero en entrar, primero en salir). Solo y si solo si no hay nadie (léase: ningún otro hilo) que esté accediendo actualmente al objeto, entonces el siguiente (hilo) en la cola puede acceder a él.

+0

Sin embargo, varios hilos pueden contener una referencia a una colección sincronizada, ¿correcto? Es solo que solo uno de esos hilos puede (agregar, obtener, configurar, poner, eliminar, etc., etc.) a la misma hora, ¿correcto? –

+1

Eso es correcto. La sincronización está en el * acceso *. – BalusC

+1

'cola de primero en entrar primero en salir (FIFO)'. No. Queueing no está especificado. No se especifica quién obtiene el próximo acceso: probablemente el hilo de espera de mayor prioridad. – EJP

2

Solo un hilo de ejecución puede cambiar el estado del contenedor en un momento dado.

Si el contenedor no estaba sincronizado, el hilo de ejecución múltiple podría intentar cambiar el estado del contenedor al mismo tiempo. Por supuesto, esto terminaría con el estado interno del contenedor dañado, es decir, no lo que desea.

Los contenedores originales de Java, p. java.util.Vector y java.util.Hashtable, todos fueron sincronizados por razones de seguridad. Pero la desventaja de sincronizar el acceso por defecto es que los casos de uso donde la sincronización no es necesaria sufrirán la penalización del rendimiento de la sincronización. Entonces ahora Java también se envía con contenedores no sincronizados, p. ArrayList y HashMap.

0

Significa que solo un hilo puede acceder a él a la vez.

Esto puede ser un problema si lo usa en un programa que usa solo un subproceso, porque el proceso de verificar quién posee el monitor (qué subproceso intenta usar) se seguirá realizando desperdiciando tiempo de procesamiento valioso.

Incluso usarlos con uno o más subprocesos puede ser menos eficaz que utilizar una versión no sincronizada y sincronizar solo las partes más peligrosas.

Cuestiones relacionadas