Pregunta

¿Cuál es la diferencia entre un Collections.synchronizedMap () y una envoltura alrededor de un HashMap con todos los métodos sincronizados. No veo ninguna diferencia becuase Collections.synchronizedMap () internamente mantiene la misma cerradura para todos los métodos.

Básicamente, ¿cuál es la diferencia entre los siguientes fragmentos de código

Class C {    
    Object o;

    public void foo() {
       synchronized(o) {
           // thread safe code here
       }
    }
}

y

Class C {
    Object o;

    public synchronized void foo() {

    }
}
¿Fue útil?

Solución

Sólo hay una diferencia:

Collections.synchronizedMap es capaz para utilizar un monitor diferente de sí mismo.

Uso de métodos sincronizados es el mismo que usar sychnchonized(this)-bloques, lo que significa, la envoltura sería el monitor y podría ser bloqueada desde el exterior de la envoltura.

Si no desea que una aplicación externa para bloquear el monitor, es necesario ocultarlo.

Por otro lado, si desea llamar a varios métodos de una manera segura hilo, que es la forma más fácil para bloquear toda la colección (pero no es muy escalable, de hecho).

PS:. Para la reutilización, es mejor delegar el método llama a una copia de seguridad de Mapa para sustituir la clase, porque se puede cambiar a otra aplicación Asignar más adelante, sin cambiar su envoltorio

Otros consejos

Ambos enfoques adquirir un monitor en el objeto y por lo tanto deben realizar exactamente la misma. La razón principal de esta diferencia es la arquitectura. La envoltura sincronizado permite la ampliación de la variación básica caja fuerte para no hilo fácilmente.

Una vez dicho que no utilizan o bien, utilizar ConcurrentHashMap. Se utiliza la fragmentación de bloqueo por lo que es mucho más rápido de usar que cualquiera de los enfoques (ya que son los mismos en términos de gastos generales + contención). striping Lock permite segmentos de la matriz de soporte para ser bloqueados de forma independiente. Esto significa que es menos probable que los dos hilos solicitarán para adquirir la misma cerradura.

No reinventar la rueda y utilizar lo que es proporcionada por la API.

Siempre debe decorar en lugar de agrupar todo y todos feartures en una clase ofrecida grande.

Siempre tome el Mapa plano y decorar con las colecciones o utilizar un java.util.concurrent y utilizar un bloqueo real, por lo que uno atómicamente puede inspeccionar y actualizar el mapa. Mañana se podría adaptar la tabla hash a un Treemap y usted estará en problemas si su pegado con una tabla hash.

Así que, ¿por qué lo preguntas? :) ¿Usted realmente cree que si la clase se coloca en el paquete java.util luego un poco de magia sucede y su código de Java funciona en cierto modo complicado?

En realidad, sólo se envuelve con todos los métodos sincronizados {} bloque y nada más.

UPD: la diferencia es que tiene mucho menos posibilidades de cometer un error si se utiliza sincronizado recogida en lugar de hacer todas las cosas por sí mismo la sincronización

.

UPD 2: como se puede ver en las fuentes que utilizan 'mutex'-objeto como monitor. Cuando se utiliza el modificador sincronizada en firma de método (es decir synchronized void doSmth()) instancia actual de su objeto (es decir this) se utiliza como un monitor. Dos bloques de código de abajo son los mismos:

1.

synchronized public void doSmth () {
   someLogic ();
   moreLogic ();
}

synchronized public static void doSmthStatic () {
   someStaticLogic ();
   moreStaticLogic ();
}

2.

public void doSmth () {
   synchronized (this) {
      someLogic ();
      moreLogic ();
   }
}

public static void doSmthStatic () {
   synchronized (ClassName.class) {
      someStaticLogic ();
      moreStaticLogic ();
   }
}

Si la seguridad del hilo es el caso, el uso de concurrencia estructuras de datos de paquete. El uso de la clase contenedora reducirá todos los accesos al mapa en una cola secuencial.

a) Temas que esperan para hacer operaciones en totalmente diferentes puntos del mapa estarán esperando por la misma cerradura. Basado en el número de hilos que esto puede afectar el rendimiento de la aplicación.

b) Considere operaciones compuestas en el mapa. El uso de un envoltorio con una cerradura individual no ayudará. Por ejemplo. "Mira si está presente a continuación, añadir" tipo de operaciones. sincronización hilo volverá a ser un problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top