Los programas multiproceso a menudo pueden llegar a una situación en la que varios subprocesos intentan acceder a los mismos recursos y finalmente producen resultados erróneos e imprevistos.
¿Por qué utilizar la sincronización Java?
La sincronización de Java se utiliza para garantizar, mediante algún método de sincronización, que solo un subproceso pueda acceder al recurso en un momento determinado.
edad de salman khan
Bloques sincronizados de Java
Java proporciona una forma de crear subprocesos y sincronizar sus tareas mediante bloques sincronizados.
Un bloque sincronizado en Java está sincronizado en algún objeto. Todos los bloques sincronizados se sincronizan en el mismo objeto y solo pueden ejecutarse un hilo dentro de ellos a la vez. Todos los demás subprocesos que intentan ingresar al bloque sincronizado se bloquean hasta que el subproceso dentro del bloque sincronizado sale del bloque.
Nota: Los bloques sincronizados en Java están marcados con la palabra clave sincronizada.
Forma general de bloque sincronizado
// Only one thread can execute at a time. // sync_object is a reference to an object // whose lock associates with the monitor . // The code is said to be synchronized on // the monitor object synchronized(sync_object) { // Access shared variables and other // shared resources }> Esta sincronización se implementa en Java con un concepto llamado monitores o bloqueos. Sólo un hilo puede poseer un monitor en un momento dado. Cuando un hilo adquiere un bloqueo, se dice que ha entrado al monitor. Todos los demás subprocesos que intenten ingresar al monitor bloqueado se suspenderán hasta que el primer subproceso salga del monitor.
Tipos de sincronización
Hay dos sincronizaciones en Java que se mencionan a continuación:
- Sincronización de procesos
- Sincronización de hilos
1. Sincronización de procesos en Java
La sincronización de procesos es una técnica utilizada para coordinar la ejecución de múltiples procesos. Garantiza que los recursos compartidos estén seguros y en orden.
2. Sincronización de subprocesos en Java
La sincronización de subprocesos se utiliza para coordinar y ordenar la ejecución de los subprocesos en un programa multiproceso. Hay dos tipos de sincronización de subprocesos que se mencionan a continuación:
- Exclusivo mutuo
- Cooperación (comunicación entre subprocesos en Java)
Exclusivo mutuo
Mutual Exclusive ayuda a evitar que los hilos interfieran entre sí mientras comparten datos. Hay tres tipos de Mutua Exclusiva que se mencionan a continuación:
- Método sincronizado.
- Bloque sincronizado.
- Sincronización estática.
Ejemplo de sincronización
A continuación se muestra la implementación de la sincronización de Java:
Java
mapa_desordenado c++
// A Java program to demonstrate working of> // synchronized.> import> java.io.*;> import> java.util.*;> // A Class used to send a message> class> Sender {> >public> void> send(String msg)> >{> >System.out.println(>'Sending '> + msg);> >try> {> >Thread.sleep(>1000>);> >}> >catch> (Exception e) {> >System.out.println(>'Thread interrupted.'>);> >}> >System.out.println(>'
'> + msg +>'Sent'>);> >}> }> // Class for send a message using Threads> class> ThreadedSend>extends> Thread {> >private> String msg;> >Sender sender;> >// Receives a message object and a string> >// message to be sent> >ThreadedSend(String m, Sender obj)> >{> >msg = m;> >sender = obj;> >}> >public> void> run()> >{> >// Only one thread can send a message> >// at a time.> >synchronized> (sender)> >{> >// synchronizing the send object> >sender.send(msg);> >}> >}> }> // Driver class> class> SyncDemo {> >public> static> void> main(String args[])> >{> >Sender send =>new> Sender();> >ThreadedSend S1 =>new> ThreadedSend(>' Hi '>, send);> >ThreadedSend S2 =>new> ThreadedSend(>' Bye '>, send);> >// Start two threads of ThreadedSend type> >S1.start();> >S2.start();> >// wait for threads to end> >try> {> >S1.join();> >S2.join();> >}> >catch> (Exception e) {> >System.out.println(>'Interrupted'>);> >}> >}> }> |
>
ejemplo de java lambda
>Producción
diagrama uml java
Sending Hi Hi Sent Sending Bye Bye Sent>
El resultado es el mismo cada vez que ejecutamos el programa.
Explicación
En el ejemplo anterior, elegimos sincronizar el objeto Remitente dentro del método run() de la clase ThreadedSend. Alternativamente, podríamos definir el bloque completo de envío () como sincronizado , produciendo el mismo resultado. Entonces no tenemos que sincronizar el objeto Mensaje dentro del método run() en la clase ThreadedSend.
// An alternate implementation to demonstrate // that we can use synchronized with method also. class Sender { public synchronized void send(String msg) { System.out.println('Sending ' + msg); try { Thread.sleep(1000); } catch (Exception e) { System.out.println('Thread interrupted.'); } System.out.println('
' + msg + 'Sent'); } }> No siempre tenemos que sincronizar un método completo. A veces es preferible sincronizar solo parte de un método . Los bloques sincronizados de Java dentro de los métodos hacen esto posible.
// One more alternate implementation to demonstrate // that synchronized can be used with only a part of // method class Sender { public void send(String msg) { synchronized(this) { System.out.println('Sending ' + msg ); try { Thread.sleep(1000); } catch (Exception e) { System.out.println('Thread interrupted.'); } System.out.println('
' + msg + 'Sent'); } } }> Ejemplo del método sincronizado usando una clase anónima
Java
// Java Pogram to synchronized method by> // using an anonymous class> import> java.io.*;> class> Test {> >synchronized> void> test_function(>int> n)> >{> >// synchronized method> >for> (>int> i =>1>; i <=>3>; i++) {> >System.out.println(n + i);> >try> {> >Thread.sleep(>500>);> >}> >catch> (Exception e) {> >System.out.println(e);> >}> >}> >}> }> // Driver Class> public> class> GFG {> >// Main function> >public> static> void> main(String args[])> >{> >// only one object> >final> Test obj =>new> Test();> >Thread a =>new> Thread() {> >public> void> run() { obj.test_function(>15>); }> >};> >Thread b =>new> Thread() {> >public> void> run() { obj.test_function(>30>); }> >};> >a.start();> >b.start();> >}> }> |
>
quien inventó la escuela
>Producción
16 17 18 31 32 33>