Quand j'ai vu cette question pour la première fois, je ne pouvais pas commencer parce que je sentais que la synchronisation et le verrouillage étaient très différents en termes de verrouillage. Par exemple, voyez comment verrouiller lorsqu'il est synchronisé dans des circonstances normales.
Méthode 1:
public synchronisé void a () {// todo}Méthode 2:
public void b () {synchronisé (this) {// todo}}À partir de ces deux manières, le verrou est ajouté entre {}. Jetons un coup d'œil à la façon dont Lock est fait:
public void c () {lock.lock (); essayez {// todo} enfin {lock.unlock (); }}Cette façon de verrouillage est ajoutée entre Lock () et Unlock (). Par conséquent, si vous souhaitez implémenter une fonction de verrouillage, vous devez réfléchir à la façon d'implémenter ces deux méthodes, Lock () et Unlock (), définissez d'abord un cadre comme suit:
public void Lock () {} public void unlock () {}Ensuite, vous devez réfléchir à la façon d'utiliser synchronisé pour implémenter ces deux méthodes.
Maintenant, je suis un peu plus clair dans mon esprit, mais je ne sais pas comment remplir ces deux méthodes. Voici comment analyser les caractéristiques du verrouillage de Lock, puis jetez un œil à ce code:
public void c () {lock.lock (); // Lorsque le thread actuel obtient le verrou, un autre thread doit attendre {// thread actuel se mette dans le verrou, un autre thread ne peut pas entrer // TODO} Enfin {lock.unlock (); // Thread actuel Release Le verrouillage}}Je viens d'ajouter un petit commentaire sur ce code et je n'ai rien fait d'autre. Est-ce que cela aide à comprendre ce code et à voir quel est le mot le plus fréquent, CurrentThread? Ainsi, lorsque nous remplissons les méthodes Lock () et déverrouiller (), devrions-nous faire attention à la saisie du mot-clé actuel pour trouver la solution? La réponse est oui.
Ensuite, analysez, comment faire attendre le fil lors de l'utilisation de synchronisés? Il s'agit d'utiliser la méthode attend (). Comment réveiller le fil? Il utilise la méthode notify (). Ensuite, vous devez utiliser la méthode Wait () dans la méthode Lock () et la méthode Notify () dans la méthode Unlock (). Ainsi, lorsque nous utilisons Wait () et Notify (), nous avons une condition. Pensez à ce que nous devrions utiliser comme condition?
Nous devons utiliser si le verrouillage actuel est occupé comme condition de jugement. Si la serrure est occupée, attendez le courant. Pensez à savoir si nous avons utilisé cette condition lors de l'utilisation de synchronisés. La réponse est oui.
Analyons quand libérer le verrou et quelles conditions sont utilisées. Pensez-vous si Thread A obtient le verrou, le fil B peut-il être libéré? Bien sûr que non. Si B peut être libéré, il viole le principe, bien sûr non. C'est certainement que le verrou de Thread A ne peut être libéré que. Par conséquent, la condition de jugement est de juger si le fil qui maintient le verrou est de courant. Si c'est le cas, il peut être libéré, mais bien sûr, il ne le peut pas.
Jetons un coup d'œil au code complet maintenant:
package test.lock; importer java.util.random; import java.util.concurrent.executorservice; import java.util.concurrent.executors; import java.util.concurrent.threadfactory; public class naivelock {private static final long long = -1; private Long propriétaire = non; private boolean islowed () {work propriétaire! Synchronized Void Lock () {Long CurrentThaRed = Thread.CurrentThread (). GetId (); if (propriétaire == CurrentThreaDID) {Throw New illégalStateException ("Lock a été acquis par le thread actuel");} while (this.islooked ()) {System.out.print {wait ();} catch (InterruptedException e) {e.printStackTrace ();}} propriétaire = currentThreadId; System.out.println (String.format ("Lock est acquis par Thread% s", propriétaire));} public Synchronized Void Unlock () {if (! this.islooked () || propriétaire! = Thread.CurrentHeadread.). IllégalStateException ("Seul Lock propriétaire peut déverrouiller le verrou");} System.out.println (string.format ("thread% s est déverrouillé", propriétaire)); System.out.println (); propriétaire = non; notify ();} public static void main (String [] Exécutors.NewFixEdThreadPool (20, new ThreadFactory () {private threadGroup Group = new ThreadGroup ("Test Thread Group"); {Group.SetDaemon (true);} @ Override Thread Public NewThread (Runnable R) {return New Thread (Group, R);}}); For (int i = 0; i <20; i ++) {Exécutor. Gens {e.printStackTrace ();} lock.unlock ();}});}}}Exécutez-le et voyez les résultats:
Verrouille est acquis par thread 8 Thread 8 est en cours d'exécution ... Thread 27 est LOCK IST LOCK 26 IST LOCK IST LOCK 25 IST LOCK ISTRE FILLE 24 IST VERR LOCK 23 IST LOCK IST LOCK 22 IST VERR LOCK 21 IST VERR LOR LORD 20 IST LOR LOR LOCK Tire de verrouillage est LOR LORVIL 18 IST VERR LOCK Tire de verrouillage est LOR LOCK 16 ISTOW 27 Thread 27 est en cours d'exécution ... Thread 27 est un verrouillage de déverrouillage est acquis par thread 26 Thread 26 est en cours d'exécution ... Thread 26 est le verrouillage de déverrouillage est acquis par Thread 25 Thread 25 est en cours d'exécution ... Le thread 25 est le verrouillage de déverrouillage est acquis par Thread 24 Thread 24 est en cours d'exécution ... Le thread 24 est le verrouillage de déverrouillage est acquis par Thread 23 Le verrouillage est acquis ... Thread 20 Thread 20 est en cours d'exécution ... Thread 20 est un verrouillage de déverrouillage est acquis par Thread 19 Thread 19 est en cours d'exécution ... Thread 19 est le verrouillage de déverrouillage est acquis par Thread 18 Thread 18 est en cours d'exécution ... Le fil 18 est le verrouillage de déverrouillage est acquis par Thread 17 Thread 17 est en cours d'exécution ... Le fil 17 est le verrouillage de déverrouillage est acquis par Thread 16 Thread 16 est en cours d'exécution ... Par thread 13 Thread 13 est en cours d'exécution ... Le fil 13 est le verrouillage de déverrouillage est acquis par le thread 12 Thread 12 est en cours d'exécution ... Le fil 12 est un verrouillage de déverrouillage est acquis par Thread 11 Thread 11 est en cours d'exécution ... Le fil 11 est le verrouillage de déverrouillage est acquis par Thread 10 Thread 10 est en cours d'exécution ... Le fil 10 est le verrouillage de déverrouillage est acquis par Thread 9 Thread 9 est en cours d'exécution ... Le thread 9 est un libellu
Si vous changez la boucle pour 30 fois, regardez les résultats:
Verrouille est acquis par thread 8 Thread 8 est en cours d'exécution ... Thread 27 est LOCK IST LOCK 26 IST LOCK IST LOCK 25 IST LOCK ISTRE FILLE 24 IST VERR LOCK 23 IST LOCK IST LOCK 22 IST VERR LOCK 21 IST VERR LOR LORD 20 IST LOR LOR LOCK Tire de verrouillage est LOR LORVIL 18 IST VERR LOCK Tire de verrouillage est LOR LOCK 16 ISTOW 27 27 est en cours d'exécution ... Thread 8 est verrouillage du verrouillage 27 Le verrouillage de déverrouillage est acquis par thread 27 Thread 27 est en cours d'exécution ... Thread 26 est LOCK IST LOCK 27 Le verrouillage de déverrouillage est acquis par Thread 27 Thread 27 est en cours ... Le fil 25 est LOR LORC FIL 27 est le verrouillage de déverrouillage est acquis par Thread 24 Thread 24 est le fil 24 est le verrouillage d'attente est le verrouillage d'attente est le verrouillage de déverrouillage est acquis par thread 22 Thread 22 est en cours d'exécution ... Thread 21 est LOCK IST LOCK 22 Le verrouillage de déverrouillage est acquis par thread 22 Thread 22 est exécuté ... Thread 20 est LOCK IST Le fil 22 est le verrouillage de déverrouillage est acquis par Thread 22 Thread 22 est exécuté ... Thread est Lock est Lock est le verrouillage 22 est acquis Thread 16 Thread 16 est en cours d'exécution ... Thread 16 est un verrouillage de déverrouillage est acquis par Thread 15 Thread 15 est en cours d'exécution ... Le thread 15 est le verrouillage de déverrouillage est acquis par Thread 14 Thread 14 est en cours d'exécution ... Le fil 14 est le verrouillage de déverrouillage est acquis par Thread 13 Thread 13 est en cours d'exécution ... Le thread 13 est le verrouillage de déverrouillage est acquis par Thread 12 Thread 12 est en cours d'exécution ... Par thread 9 Thread 9 est en cours d'exécution ... Thread 9 est le verrouillage de déverrouillage est acquis par Thread 8 Thread 8 est en cours d'exécution ... Le fil 8 est le verrouillage de déverrouillage est acquis par Thread 26 Thread 26 est en cours d'exécution ... Thread 26 est le verrouillage de déverrouillage est acquis par Thread 25 Thread 25 est en cours d'exécution ... Le thread 25 est le verrouillage de déverrouillage est acquis par thread 27 Thread 27 est en cours d'exécution ... acquis par Thread 21 Thread 21 est en cours d'exécution ... Le thread 21 est un verrouillage de déverrouillage est acquis par Thread 20 Thread 20 est en cours d'exécution ... Le fil 20 est un verrouillage de déverrouillage est acquis par Thread 19 Thread 19 est en cours d'exécution ... Le thread 19 est le verrouillage de déverrouillage est acquis par Thread 18 Thread 18 est en cours d'exécution ... Le thread 18 est déverrouillé
Résumer
Ce qui précède est toute l'explication détaillée de cet article sur l'utilisation de Synchronisée pour implémenter un code de verrouillage. J'espère que ce sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à ce site:
Java Thread Synchronisation Lock Lock Synchronisation Lock Code Exemple
La différence entre synchronisé et verrouillage dans la programmation Java [recommandée]
Java Multithread ReadWritelock Read-Write Sepaning Impametteur Code
S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!