Mi opinión sería que no hay diferencia entre los dos, excepto que el bloque de sincronización podría estar más localizado en el alcance y por lo tanto, el bloqueo será de menor tiempo ??
Sí. Tienes razón. A diferencia de los métodos synchronized
, las sentencias sincronizadas deben especificar el objeto que proporciona el bloqueo intrínseco.
Ejemplo de tutorial java:
public void addName(String name) {
synchronized(this) {
lastName = name;
nameCount++;
}
nameList.add(name);
}
estados sincronizados también son útiles para mejorar la concurrencia con la sincronización de grano fino. Puede encontrar un buen ejemplo en la misma página de tutorial para el caso de uso a continuación.
Supongamos, por ejemplo, que la clase MsLunch
tiene dos campos de instancia, c1 y c2, que nunca se utilizan juntos. Todas las actualizaciones de estos campos deben ser synchronized
, pero no hay ninguna razón para evitar que una actualización de c1 se interponga con una actualización de c2, y al hacerlo se reduce la concurrencia al crear bloqueos innecesarios. En lugar de utilizar métodos sincronizados o utilizar el bloqueo asociado a esto, creamos dos objetos únicamente para proporcionar bloqueos.
Y en caso de bloqueo en un método estático, ¿en qué se toma la cerradura? ¿Cuál es el significado de un bloqueo en la clase?
En este caso, el hilo adquiere el bloqueo intrínseco para el objeto de Clase asociado a la clase. Por lo tanto, el acceso a los campos estáticos de la clase está controlado por un bloqueo que es distinto del bloqueo para cualquier instancia de la clase.
Al realizar un método como synchronized (no static
):
No es posible que dos invocaciones de métodos synchronized
sobre el mismo objeto para intercalar. 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.
Si comete un método que static synchronized
:
No es posible que dos invocaciones de métodos static synchronized
sobre diferentes objetos de la misma clase para intercalar. Cuando un subproceso ejecuta un método static synchronized
para un objeto de Clase A, todos los demás subprocesos que invocan métodos static synchronized
en cualquiera de los objetos del bloque Clase A (suspensión de ejecución) hasta que el primer subproceso se completa con la ejecución del método.
a encontrar mejores alternativas a la sincronización en esta pregunta: SE
Avoid synchronized(this) in Java?
@ try-catch-finally Eso no es un duplicado de esta cuestión; esa pregunta pregunta si un método sincronizado proporciona acceso exclusivo al método solamente, o al objeto completo. –
@MarkRotteveel Tienes razón en términos de los diferentes títulos. Por otro lado, las respuestas de la otra pregunta también cubren las diferencias: determinar la sección sincronizada de algunas afirmaciones (o no) y controlar dónde bloquear (o no tener control sobre eso). –