Pregunta Objeto de bloqueo estático frente a no estático en bloque sincronizado


Intentando visualizar y entender sincronización.

  1. ¿Cuáles son las diferencias entre usar un objeto de bloqueo estático (código A)

32
2017-08-21 11:58


origen


Respuestas:


La diferencia es simple: si el objeto encerrado está en una static campo, luego todas las instancias de MyClass* será compartir ese bloqueo (es decir, no habrá dos objetos que puedan bloquear ese objeto al mismo tiempo).

Si el campo no es estático, cada instancia tendrá su propio bloqueo, por lo que solo las llamadas al método en el mismo objeto se bloquearán entre sí.

Cuando usas un objeto de bloqueo estático:

  • Hilo 1 llamadas o1.foo()
  • Hilo 2 llamadas o1.foo(), tendrá que esperar a que termine el hilo 1
  • Hilo 3 llamadas o2.foo(), será además tiene que esperar que el hilo 1 (y probablemente 2) termine

Cuando utiliza un objeto de bloqueo no estático:

  • Hilo 1 llamadas o1.foo()
  • Hilo 2 llamadas o1.foo(), tendrá que esperar a que termine el hilo 1
  • Hilo 3 llamadas o2.foo(), puede continuar, sin importar el hilo 1 y 2

¿Cuál de esos necesitarás depende de qué tipo de datos intentas? proteger con tu bloque sincronizado.

Como regla general, quiere que el objeto lock tenga el mismo static-ness que el valor operado. Entonces, si manipulas valores no estáticos solamente, querrás un objeto de bloqueo no estático. Si manipulas valores estáticos solamente, querrás un objeto de bloqueo estático.

Cuando manipulas estático y no estático valores, entonces se volverá complicado. los fácil sería simplemente usar un objeto de bloqueo estático, pero eso podría aumentar el tamaño del bloque sincronizado más de lo absolutamente necesario y podría necesitar bloquear más la contención de lo deseado. En esos casos, es posible que necesite una combinación de objetos de bloqueo estáticos y no estáticos.

En su caso particular, utiliza el bloqueo en el constructor, que solo se ejecutará una vez por instancia, por lo que un objeto de bloqueo no estático no tiene sentido aquí.


45
2017-08-21 12:04