suma sincronizados resueltos programas multihilos metodos hilos fuente entre ejemplos con comunicacion codigo java multithreading synchronized java-threads

java - sincronizados - Si sincronizo dos métodos en la misma clase, ¿pueden ejecutarse simultáneamente?



programas con hilos en java (9)

Ambos métodos bloquean el mismo monitor. Por lo tanto, no puede ejecutarlos simultáneamente en el mismo objeto desde diferentes hilos (uno de los dos métodos se bloqueará hasta que el otro termine).

Si sincronizo dos métodos en la misma clase, ¿pueden ejecutarse simultáneamente en el mismo objeto ? por ejemplo:

class A { public synchronized void methodA() { //method A } public synchronized void methodB() { // method B } }

Sé que no puedo ejecutar methodA() dos veces en el mismo objeto en dos subprocesos diferentes. Lo mismo en el methodB() .

Pero, ¿puedo ejecutar el methodB() en un hilo diferente mientras el methodA() aún se está ejecutando? (mismo objeto)


Desde el link documentación de link

Hacer que los métodos estén sincronizados tiene dos efectos:

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

Esto responderá a su pregunta: en el mismo objeto, no puede llamar al segundo método sincronizado cuando la ejecución del primer método sincronizado está en progreso.

Eche un vistazo a esta link documentación para comprender los bloqueos intrínsecos y el comportamiento de bloqueo.


Dos hilos diferentes ejecutan un método común sincronizado en el objeto individual, ya que el objeto es el mismo, cuando un hilo lo usa con método sincronizado, tendrá que varificar el bloqueo; si el bloqueo está habilitado, este hilo pasará al estado de espera, si el bloqueo está deshabilitado, puede acceder al objeto, mientras que accederá habilitará el bloqueo y liberará el bloqueo solo cuando se complete la ejecución. cuando lleguen los otros hilos, variará el bloqueo, ya que está habilitado, esperará hasta que el primer hilo complete su ejecución y liberará el bloqueo puesto en el objeto; una vez que se libere el bloqueo, el segundo hilo obtendrá acceso al objeto y habilitará el bloqueo hasta su ejecución. para que la ejecución no sea simultánea, ambos hilos se ejecutarán uno por uno, cuando ambos hilos usen el método sincronizado en diferentes objetos, se ejecutarán simultáneamente.


En su caso, sincronizó dos métodos en la misma instancia de clase. Por lo tanto, estos dos métodos no se pueden ejecutar simultáneamente en diferentes subprocesos de la misma instancia de la clase A. Pero sí pueden en diferentes instancias de clase A.

class A { public synchronized void methodA() { //method A } }

es lo mismo que:

class A { public void methodA() { synchronized(this){ // code of method A } } }


Java Thread adquiere un bloqueo de nivel de objeto cuando ingresa en un método java instanciado y adquiere un bloqueo de nivel de clase cuando ingresa al método java sincronizado estático .

En su caso, los métodos (instancia) son de la misma clase. Entonces, cuando un hilo ingresa al método java synchronized o block, adquiere un lock (el objeto sobre el que se llama el método). Por lo tanto, no se puede llamar a otro método al mismo tiempo en el mismo objeto hasta que se complete el primer método y se libere el bloqueo (en el objeto).


Lo estás sincronizando en un objeto, no en una clase. Entonces no pueden correr simultáneamente en el mismo objeto


Para mayor claridad, es posible que tanto el método sincronizado estático sincronizado como el no estático puedan ejecutarse de manera simultánea o concurrente porque uno tiene bloqueo de nivel de objeto y otro bloqueo de nivel de clase.


Piensa en tu código como el siguiente:

class A { public void methodA() { synchronized(this){ //method A body } } public void methodB() { synchronized(this){ // method B body } }

Por lo tanto, sincronizado en el nivel de método simplemente significa sincronizado (esto). si algún hilo ejecuta un método de esta clase, obtendría el bloqueo antes de comenzar la ejecución y lo mantendrá hasta que finalice la ejecución del método.

Pero, ¿puedo ejecutar el método B () en un hilo diferente mientras el método A () aún se está ejecutando? (mismo objeto)

¡De hecho, no es posible!

Por lo tanto, varios hilos no podrán ejecutar ningún número de métodos sincronizados en el mismo objeto simultáneamente.


Ponerse synchronized en un método significa que el hilo tiene que adquirir el bloqueo en la instancia del objeto antes de ingresar ese método, por lo que si tiene dos métodos diferentes marcados sincronizados, los hilos que los ingresen compiten por el mismo bloqueo y una vez que un hilo obtiene el bloqueo todos los otros subprocesos están excluidos de todos los métodos que se sincronizan en ese mismo bloqueo. Entonces, para que los dos métodos se ejecuten simultáneamente, deberían usar bloqueos diferentes, como este:

class A { private final Object lockA = new Object(); private final Object lockB = new Object(); public void methodA() { synchronized(lockA) { //method A } } public void methodB() { synchronized(lockB) { //method B } } }