La synchronisation du thread Java est fondamentalement en ligne avec une logique: Ajouter un verrouillage -------> Modifier --------> Verrouillage de libération
1. Synchroniser les blocs de code
Les exemples sont les suivants:
classe publique SyncBlock {classe statique dataWrap {int i; } classe statique SyncBlockThread étend le thread {Date de dataWRAP privé; public syncblockthread (dataWrap dataWrap) {this.date = dataWrap; } @Override public void run () {for (int i = 0; i <10; i ++) {synchronisé (date) {date.i ++; Essayez {Sleep (1); } catch (InterruptedException e) {e.printStackTrace (); } System.out.println (getName () + "" + date.i); }}}} public static void main (string [] args) {// variable d'implémentation multi-thread i ajoute une sortie dans la séquence dataWrap dataWrap = new DataWrap (); new SyncBlockThread (dataWrap) .Start (); new SyncBlockThread (dataWrap) .Start (); new SyncBlockThread (dataWrap) .Start (); }}Dans l'exemple, vous souhaitez produire des entiers en séquence.
Habituellement, les blocs de code synchrones sont des objets qui doivent être verrouillés et sont généralement des ressources partagées qui nécessitent un accès simultané. Tout fil verrouille d'abord la ressource avant de modifier la ressource spécifiée. Pendant la période de verrouillage, d'autres threads ne peuvent pas modifier la ressource. Cela garantit la sécurité des fils. De plus, le fil n'abandonnera pas le verrouillage des ressources lors de l'appel de sommeil ou de rendement.
2. Méthode de synchronisation
classe publique SyncMethod {classe statique dataWrap {int i; public synchronisé void Valuegrow () {i ++; essayez {thread.sleep (1); } Catch (InterruptedException e) {// TODO Block de catch généré automatiquement e.printStackTrace (); } System.out.println (thread.currentThread (). GetName () + "" + i); }} classe statique SyncMethodThread étend Thread {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) {// implémentation de croissance et de sortie séquentiels i dataWrap dataWrap = new DataWrap (); new SyncMethodThread (dataWrap) .Start (); new SyncMethodThread (dataWrap) .Start (); new SyncMethodThread (dataWrap) .Start (); }}La méthode de synchronisation est une méthode modifiée par le mot-clé synchronisé. La méthode de synchronisation verrouille l'objet lui-même. Par conséquent, lorsqu'un thread appelle la méthode de synchronisation d'un certain objet, si d'autres threads appellent d'autres méthodes de synchronisation de l'objet, ils doivent toujours attendre pour libérer le verrou de l'objet car l'objet a été verrouillé.
3. Verrouillage synchrone
La synchronisation est réalisée en définissant un objet de verrouillage de synchronisation, auquel cas le verrou de synchronisation utilise un objet de verrouillage pour agir comme.
import java.util.concurrent.locks.lock; import java.util.concurrent.locks.reentrantLock; public class synclock {static class dataWrap {lock lock = new reentrantLock (); int i; public void valuegrow () {lock.lock (); essayez {i ++; essayez {thread.sleep (1); } Catch (InterruptedException e) {// TODO Block de catch généré automatiquement e.printStackTrace (); } System.out.println (thread.currentThread (). GetName () + "" + i); } enfin {lock.unlock (); }}} classe statique SynclockThread étend Thread {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) {// implémentation de croissance et de sortie séquentiels i dataWrap dataWrap = new DataWrap (); new SynclockThread (dataWrap) .Start (); new SynclockThread (dataWrap) .Start (); new SynclockThread (dataWrap) .Start (); }}L'utilisation d'objets de verrouillage pour implémenter la synchronisation du thread sera plus flexible. Certaines serrures ont également des fonctions spécifiques, parmi lesquelles les verrous de lecture et d'écriture de lecture plus couramment utilisés, et Reentrantlock peuvent réintégrer la serrure.