La sincronización de hilo de Java está fundamentalmente en línea con una lógica: Agregar bloqueo -------> Modificar --------> Lanzamiento de liberación
1. Sincronizar bloques de código
Los ejemplos son los siguientes:
clase pública syncblock {static class datawrap {int i; } SyncBlockThread de clase estática extiende el hilo {fecha de DataWrap privada; public SyncBlockThread (DataWrap DataWrap) {this.date = datawrap; } @Override public void run () {for (int i = 0; i <10; i ++) {sincronizado (date) {date.i ++; intente {dormir (1); } catch (InterruptedException e) {E.PrintStackTrace (); } System.out.println (getName () + "" + date.i); }}}} public static void main (string [] args) {// variable de implementación de múltiples subprocesos i agrega una salida en secuencia datawrap datawrap = new DataWrap (); nuevo SyncBlockThread (DataWrap) .Start (); nuevo SyncBlockThread (DataWrap) .Start (); nuevo SyncBlockThread (DataWrap) .Start (); }}En el ejemplo, desea emitir enteros en secuencia.
Por lo general, los bloques de código sincrónicos son objetos que necesitan ser bloqueados y generalmente son recursos compartidos que requieren acceso concurrente. Cualquier hilo primero bloquea el recurso antes de modificar el recurso especificado. Durante el período de bloqueo, otros hilos no pueden modificar el recurso. Esto garantiza la seguridad de los hilos. Además, el hilo no renunciará al bloqueo de recursos al llamar a dormir o rendimiento.
2. Método de sincronización
clase pública SyncMethod {static class datawrap {int i; public sincronizado void valuegrow () {i ++; intente {Thread.sleep (1); } Catch (InterruptedException e) {// TODO Auto Generado Bloque E.PrintStackTrace (); } System.out.println (thread.currentThread (). GetName () + "" + i); }} La clase estática SyncMethodthread extiende el hilo {DataWrap DataWrap; public SyncMethodthread (DataWrap DataWrap) {this.datawrap = datawrap; } @Override public void run () {for (int i = 0; i <10; i ++) {dataWrap.ValueGrow (); }}} public static void main (string [] args) {// implementa crecimiento secuencial y salida i datawrap datawrap = new DataWrap (); nuevo SyncMethodthread (DataWrap) .Start (); nuevo SyncMethodthread (DataWrap) .Start (); nuevo SyncMethodthread (DataWrap) .Start (); }}El método de sincronización es un método modificado por la palabra clave sincronizada. El método de sincronización bloquea el objeto en sí. Por lo tanto, cuando un hilo llama al método de sincronización de un determinado objeto, si otros hilos llaman a otros métodos de sincronización del objeto, aún tiene que esperar para liberar el bloqueo del objeto porque el objeto ha sido bloqueado.
3. Lock sincrónico
La sincronización se logra definiendo un objeto de bloqueo de sincronización, en cuyo caso el bloqueo de sincronización utiliza un objeto de bloqueo para actuar como.
import java.util.concurrent.locks.lock; import java.util.concurrent.locks.reentrantlock; public class synclock {static class datawrap {bloqueo bloquear = new ReentrantLock (); int i; public void valueGrow () {Lock.lock (); intente {i ++; intente {Thread.sleep (1); } Catch (InterruptedException e) {// TODO Auto Generado Bloque E.PrintStackTrace (); } System.out.println (thread.currentThread (). GetName () + "" + i); } Finalmente {Lock.unlock (); }}} La clase estática SynClockThread extiende el hilo {DataWrap DataWrap; public SynClockThread (DataWrap DataWrap) {this.datawrap = datawrap; } @Override public void run () {for (int i = 0; i <10; i ++) {dataWrap.ValueGrow (); }}} public static void main (string [] args) {// implementa crecimiento secuencial y salida i datawrap datawrap = new DataWrap (); nuevo SynClockThread (DataWrap) .Start (); nuevo SynClockThread (DataWrap) .Start (); nuevo SynClockThread (DataWrap) .Start (); }}El uso de objetos de bloqueo para implementar la sincronización de subprocesos será más flexible. Algunas cerraduras también tienen algunas funciones específicas, entre las cuales las liquidaciones de lectura y escritura de lectura más comúnmente utilizadas, y el reentrado puede volver a ingresar el bloqueo.