Lorsqu'un mot-clé de langue Java est utilisé pour modifier une méthode ou un bloc de code, il peut s'assurer qu'au plus un thread exécute le code en même temps.
1. Utilisez-le lors de la déclaration de la méthode, après l'opérateur de la portée (public, etc.), avant la déclaration de type retour (void, etc.). Entrez la méthode à la fois, et d'autres threads si vous souhaitez appeler cette méthode pour le moment, vous ne pouvez qu'attendre en ligne. peut entrer.
Par exemple:
public synchronisé void synmethod () {// Méthode Body}2. Utiliser les supports suivis des supports et des variables sont incluses dans les supports.
public int synmethod (int a1) {synchronisé (a1) {// Un seul thread peut entrer à un moment}} 3. Il y a un objet dans les supports après la synchronisation.
classe publique Mythread implémente Runnable {public static void main (String args []) {mythread mt = new mythread (); ); t6 "); t1.start (); t2.start (); t3.start (); t4.start (); t5.start (); t6.start ();} public void run () {synchronisé (this this ) {System.out.println (thread.currentThread (). GetName ());}}}Pour 3, si le thread entre, il obtient le verrouillage de l'objet actuel, puis toutes les opérations d'autres threads sur tous les objets de la classe ne peuvent pas être effectuées. Pourquoi verrouiller l'ensemble de l'objet sans permettre à d'autres threads d'utiliser brièvement d'autres méthodes de synchronisation de l'objet pour accéder aux ressources partagées? Si un objet dispose de plusieurs ressources, il n'a pas besoin de verrouiller tous les threads à l'extérieur juste pour qu'un thread utilise certaines des ressources. Étant donné que chaque objet a un verrou, vous pouvez utiliser un objet virtuel pour le verrouiller comme suit:
classe finegrainlock {myMemberClass x, y; Utilisez des ressources partagées synchronisées (ylock) {// accéder à y ici}} public void bar () {synchronisé (this) {// accéder à la fois x et y ici} // faire quelque chose ici - mais n'utilisez pas de ressources partagées}} }4. La classe est dans les supports après la synchronisation.
classe ArrayWithOrdOrd {private static long num_locks = 0; / Ajouter 1 au numéro de verrouillage. lock_order = num_locks; }} public long LockOrder () {return Lock_Order;} public int [] array () {return arr;}} classe Someclass implémente {public int sumArrays (arraywithlockOrder a1, arraywithlockOrder a2) {int value = 0; ; int size = a1.array (). la longueur; // commande. d'abord = a2; dernier = a1;} synchronisé (d'abord) {// verrouiller l'objet dans l'ordre correct. synchronisé (dernier) {int [] arr1 = a1.array (); int [] arr2 = a2.Array (); i];}}}Pour 4, si le thread entre, toutes les opérations dans le thread ne peuvent pas être effectuées dans la classe, y compris les variables statiques et les méthodes statiques.
PS: Résumé de l'utilisation synchronisée
Synchronisé utilise différents endroits pour affecter le code:
1. Méthode de modification des mots clés synchronisée
En supposant que P1 et P2 sont différents objets de la même classe, cette classe définit le bloc de synchronisation ou la méthode de synchronisation dans les situations suivantes, et P1 et P2 peuvent les appeler.
Méthode void synchronisée publique () {//}Il s'agit de la méthode de synchronisation. C'est-à-dire que lorsqu'un objet P1 exécute cette méthode de synchronisation dans différents threads, ils formeront une exclusion mutuelle pour réaliser l'effet de la synchronisation. Dans le même temps, s'il existe plusieurs méthodes de synchronisation dans l'objet, lorsqu'un thread exécute une méthode synchronisée dans l'objet, d'autres méthodes de synchronisation dans l'objet ne peuvent pas être exécutées par d'autres threads. Cependant, un autre objet P2 généré par la classe à laquelle appartient cet objet peut appeler arbitrairement cette méthode avec le mot-clé synchronisé ajouté.
L'exemple de code ci-dessus équivaut au code suivant:
Méthode publique de void () {synchronisé (this) {// ..}}Cette fois, il s'agit d'un verrou d'objet P1. .
2 Synchroniser les blocs, l'exemple de code est le suivant:
Méthode publique de void () {synchronisé (this) {// ..}}À l'heure actuelle, le verrou est l'objet SO, et chaque objet correspond à un verrou unique, de sorte que quiconque obtient ce verrouillage d'objet pourra exécuter le code qu'il contrôle. Lorsqu'il y a un objet clair comme verrouillage, vous pouvez écrire le programme comme celui-ci, mais lorsqu'il n'y a pas d'objet clair comme verrouillage, vous voulez juste un morceau de code à synchroniser, vous pouvez créer une variable d'instance spéciale (ce doit être un objet) pour agir comme une serrure:
octet privé [] lock = nouveau octet [0];
Remarque: les objets du tableau d'octets de longueur zéro sont plus économiques que n'importe quel objet à créer.
3 et 3 Utilisez la fonction synchronisée à la fonction statique, l'exemple de code est le suivant:
Classe foo {public synchronisé statique vide méthode1 () {//. Les deux méthodes synchrones appellent le verrouillage de classe de la classe à laquelle appartient l'objet de cette méthode (classe, non plus un objet spécifique généré par cette classe).
On peut en déduire que si une classe définit une fonction statique synchronisée A et définit également une fonction d'instance synchronisée B, alors le même objet Obj de cette classe ne constituera pas respectivement A et B lors de l'accès à deux méthodes A et B dans plusieurs threads . Le verrouillage de la méthode A est la classe à laquelle appartient OBJ, et le verrou de B est l'objet à lequel appartient OBJ.