Java: ¿Qué es, si hay algo, está bloqueado por métodos sincronizados aparte del objeto al que pertenecen?

StackOverflow https://stackoverflow.com/questions/609963

Pregunta

Ahora, no estoy seguro de si esta es una pregunta estúpida, por favor, tenga paciencia conmigo si lo es.

Es el bloqueo en un objeto " recursivo " i. mi. si dos objetos tienen referencias a un tercer objeto en sus campos y un subproceso está ejecutando un método sincronizado en uno de los dos, ¿puede otro subproceso acceder al tercer objeto?

// a and b are some objects that implement Runnable
// they both reference the same third object
a.ref = c;
b.ref = c;

// a is run in a thread and processes some data in a loop for a long time
// the method the loop belongs to is declared synchronized
threadA = new Thread(a);
threadA.start();

a.someSyncedMethod(); // this would block ...
b.ref.someOtherSyncedMethod(); // ... but would this?
a.ref.someOtherSyncedMethod(); // ... and how about this?
¿Fue útil?

Solución

Vale la pena separar los conceptos de " un bloqueo " y " bloqueando un objeto " ;. No hay una idea real de " bloqueo de un objeto " - hay " adquiriendo (y liberando) " el bloqueo asociado con un objeto. Sí, suena como si no lo hubiera hecho, pero la distinción es importante porque si se habla de que un objeto está bloqueado, parece que no hay otros hilos que puedan cambiar nada en el objeto mientras ese bloqueo esté celebrado.

En su lugar, solo significa que ningún otro hilo podrá adquirir el mismo bloqueo mientras se mantiene el bloqueo. No hay una relación directa entre el bloqueo y ninguno de los contenidos del objeto con el que está asociado el bloqueo.

Métodos declarados " sincronizados " Adquirir el bloqueo asociado a la instancia del objeto al que pertenecen. Esto solo hace que otros métodos sincronizados en el mismo objeto esperen, y sentencias sincronizadas que se sincronizan explícitamente en él.

Personalmente no me gustan los métodos sincronizados, me gusta aclarar la sincronización explícitamente en una variable miembro (privada, final) que solo se usa para la sincronización.

Otros consejos

a.someSyncedMethod(); // this would block ...

Solo si marca el método de ejecución con sincronizado o tiene el código de ejecución de ThreadA en métodos sincronizados.

En la JVM, cada objeto posee lo que se conoce como un monitor. Solo un hilo puede poseer el monitor asociado con un objeto dado a la vez. Sincronizado es el medio por el cual le indica al subproceso actual que busque el monitor antes de continuar.

También la clase en sí misma posee un monitor para métodos estáticos.

El significado de un " bloqueo " (en realidad, esta variante se denomina monitor) es completamente una convención, no se aplican restricciones de acceso.

El funcionamiento se basa en que todos los objetos se comportan bien y adquieren el bloqueo correspondiente antes de acceder a los datos. Solo encapsulando este comportamiento deseado dentro de una clase con controles de acceso adecuados, puede imponerlo para los objetos del cliente.

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