variable sincronizar sincronizacion productor procesos hilos fuente ejemplos consumidor codigo acceso java android multithreading thread-safety deadlock

sincronizar - Metodo sincronizado de Java



sincronizar procesos java (3)

En este contexto, la synchronized simultáneamente este método y cualquier otro método marcado como synchronized en su clase.

Considere este código:

public synchronized void onSignalsTimeout(List<SignalSpec> specs) { if (specs != null && specs.size() > 0) { for (SignalSpec spec : specs) { ParsedCANSignal timeoutedSignal = new ParsedCANSignal(); SignalsProvider.getInstance().setSignal(spec.name, spec.parent.parent.channel, timeoutedSignal); } } }

Tengo una pregunta simple: cuando Thread 1 llama al método onSignalsTimeout, ¿puede Thread 2 acceder a los objetos a los que se accede en ese método?

No se puede encontrar en ningún lugar si el ''sincronizado'' bloquea solo el acceso a este método o el acceso a todos los objetos utilizados en este método.


En primer lugar, olvídate de los métodos sincronizados. Un llamado método sincronizado ...

synchronized AnyType foobar(...) { doSomething(); }

No es más que una forma abreviada de escribir esto:

AnyType foobar(...) { synchronized(this) { doSomething(); } }

No hay nada especial sobre el método en ambos casos. Lo que es especial es el bloque sincronizado, y lo que hace un bloque sincronizado es muy simple. Cuando la JVM ejecuta esto:

synchronized(foo) { doSomething(); }

Primero evalúa la expresión foo . El resultado debe ser una referencia de objeto. Luego bloquea el objeto, ejecuta el cuerpo del bloque synchronized y luego desbloquea el objeto.

Pero, ¿qué significa bloqueado ? Puede significar menos de lo que piensas. No impide que otros subprocesos utilicen el objeto. No les impide acceder a los campos del objeto o actualizar sus campos. Lo único que impide el bloqueo de un objeto es que evita que otros subprocesos bloqueen el mismo objeto al mismo tiempo.

Si el hilo A intenta ingresar synchronized(foo) {...} mientras el hilo B ya tiene bloqueado foo (ya sea en el mismo bloque synchronized , o en otro diferente), el hilo A se verá obligado a esperar hasta que el hilo B libere el bloquear.

Utiliza bloques synchronized para proteger los datos .

Supongamos que su programa tiene una colección de objetos que pueden estar en diferentes estados . Supongamos que algunos estados tienen sentido, pero hay otros estados que no tienen sentido: estados no válidos .

Supongamos que no es posible que un hilo cambie los datos de un estado válido a otro estado válido sin crear temporalmente un estado no válido.

Si coloca el código que cambia el estado en un bloque synchronized(foo) y coloca cada bloque de código que puede ver el estado en un bloque sincronizado que bloquea el mismo objeto , foo , evitará que otros subprocesos vean la secuencia. Estado inválido temporal.


Sí, otros hilos pueden acceder a los objetos utilizados en el método; la palabra clave sincronizada garantiza que no más de un hilo en el momento puede ejecutar el código del método.

Desde https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html :

  • En primer lugar, no es posible intercalar dos invocaciones de métodos sincronizados en el mismo objeto. Cuando un subproceso está ejecutando un método sincronizado para un objeto, todos los demás subprocesos que invocan métodos sincronizados para el mismo bloque de objeto (suspensión de ejecución) hasta que el primer subproceso se realiza con el objeto.
  • Segundo, cuando un método sincronizado sale, automáticamente establece una relación de suceso antes de 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 subprocesos. Tenga en cuenta que los constructores no se pueden sincronizar; usar la palabra clave sincronizada con un constructor es un error de sintaxis. La sincronización de constructores no tiene sentido, porque solo el hilo que crea un objeto debe tener acceso a él mientras se está construyendo.