2010-07-12 27 views
9

Tengo 2 métodos sincronizados en una clase decir method1() y method2(). Un hilo dice "Subproceso 1" mantiene el bloqueo de ese objeto de la clase ejecutando el método sincronizado1(). ¿Puede otro subproceso decir "Subproceso 2", acceder al bloqueo mediante el método2() al mismo tiempo mientras se mantiene "Subproceso 1" La cerradura.dos métodos sincronizados diferentes del mismo objeto?

Este caso es análogo a la clase java.util.Vector que tiene métodos add() y remove() sincronizados. Por favor, explique este caso también.

Respuesta

10

No. Un método synchronized en Java es idéntico al método completo que tiene su cuerpo envuelto en un bloque synchronized (this). Entonces, si un hilo está en un método synchronized, otro hilo no puede estar simultáneamente en un método synchronized diferente en el mismo objeto.

La forma en que esto se relaciona con un Vector es que no quiere que algún código intente eliminar un elemento mientras otro código intenta agregar un elemento. Este es el concepto de una sección crítica ; no solo no quieres que otra persona intente hacer lo que estás haciendo, sino que tampoco quieres que otra persona haga algo diferente que pueda interferir.

+0

Gracias Borealid .. Pero si este es el caso, ¿Por qué Java proporciona una sincronización específica a los métodos, que pueden simplemente proporcionan para la ¿toda la clase? – JavaUser

+1

@JavaUser: 'synchronized (this)' no significa que toda la clase está 'sincronizada'. Significa que adquieres el bloqueo de objeto de la instancia en la que se invocó el método. No necesariamente quiere que * todos * los métodos estén 'sincronizados' (de hecho, rara vez lo hará). Para obtener el rendimiento del código multiproceso, debe usar el menor número de bloqueos posible mientras se preserva la corrección del programa: cada vez que tenga un bloqueo contendido, un hilo esperará y no hará nada. – Borealid

+0

@ Borealid ... el momento que definí sincronizado en cualquier método significa que todo el objeto está bloqueado cuando llamo a ese método. ¿Estoy en lo correcto? – JavaUser

3

Thread2 puede acceder a la cerradura pero no puede ingresar al bloque protegido por esa cerradura siempre que Thread1 mantenga presionado el mismo candado.

+0

que fue útil. ¡Gracias! – peakit

Cuestiones relacionadas