Locksupport est un premier fil de discussion de base primitif utilisé pour créer des verrous et d'autres classes de synchronisation.
Les fonctions de Park () et undark () dans Locksupport doivent bloquer les threads et débloquer les threads, respectivement, et Park () et unstark () ne rencontrera pas les "impasses qui peuvent être causées par le problème de thread.suspennd et de thread.resume".
Parce que Park () et un unmark () ont des autorisations; La concurrence entre le fil d'appel par parc () et un autre fil qui essaie de Unpark () restera actif.
Utilisation de base
Locksupport est très similaire à un sémaphore binaire (une seule licence est disponible). Si cette licence n'a pas été occupée, le thread actuel obtient la licence et continue de s'exécuter; Si la licence a été occupée, le thread actuel bloque, en attendant d'obtenir la licence.
public static void main (String [] args) {lockSupport.park (); System.out.println ("Block.");}L'exécution du code révèlera que le thread principal bloque toujours. Étant donné que la licence est occupée par défaut, la licence ne peut pas être obtenue lors de l'appel Park (), donc elle entre dans un état de blocage.
Le code suivant: Libérez d'abord la licence, puis obtenez la licence et le thread principal peut se terminer normalement. L'acquisition et la libération de licences LockSupport sont généralement correspondantes. Si vous désartisez plusieurs fois, il n'y aura aucun problème si vous ne vous garez qu'une seule fois. En conséquence, la licence est dans un état disponible.
public static void main (String [] args) {thread thread = thread.currentThread (); Locksupport.unpark (thread); // relâchez la licence locksupport.park (); // obtenir le système de licence.out.println ("b");}Locksupport n'est pas réentrant. Si un thread appelle LocksUpport .Park () deux fois de suite, le fil se bloquera certainement.
public static void main (string [] args) lève l'exception {thread thread = thread.currentThread (); Locksupport.unpark (thread); System.out.println ("A"); Locksupport.park (); System.out.println ("B"); Locksupport.park (); System.out.println ("C");}Ce code imprime A et B, mais n'imprime pas C, car le thread ne peut pas obtenir l'autorisation lors de l'appel du parc la deuxième fois.
Jetons un coup d'œil à la réponse des interruptions correspondantes de Locksupport
public static void t2 () lève une exception {thread t = new Thread (new Runnable () {private int count = 0; @Override public void run () {long start = System.currenttimemillis (); long fin = 0; while ((end - start) <= 1000) {count ++; end = System.currenttimeLis ();} system.out.print ("après un second. + Count); t.start (); Thread.Sleep (2000); // Interrupteur thread t.interrupt (); System.out.println ("Main Over");}Le fil imprimera le fil sur. True. Cela signifie que si le thread bloque en raison de l'appel Park, il peut répondre à une demande d'interruption (le statut d'interruption est défini sur true), mais ne lancera pas une interruption.
Liste des fonctions de verrouillage
// Renvoie l'objet bloqueur fourni à l'appel de méthode du parc non bloqué le plus récent et renvoie Null si l'appel n'est pas bloqué. objet statique getblocker (thread t) // Pour la planification du thread, désactivez le thread actuel à moins que la licence ne soit disponible. Static void Park () // Pour la planification du thread, désactivez le thread actuel avant que la licence ne soit disponible. STATIC VOID Park (bloqueur d'objets) // Pour la planification des threads, attendez le temps d'attente spécifié au maximum à moins que la licence ne soit disponible. STATIC VOID PARKNANOS (Long Nanos) // Pour la planification du thread, désactivez le fil actuel avant la présence de la licence et attendez le temps d'attente spécifié au maximum. STATIC VOID PARKNANOS (bloqueur d'objets, nanos longs) // Pour la planification du thread, le thread actuel est désactivé avant la limite de temps spécifiée à moins que la licence ne soit disponible. Parkuntil statique vide (échéance longue) // Pour la planification du thread, le thread actuel est désactivé avant la limite de temps spécifiée, sauf si la licence est disponible. Parkuntil vide statique (bloqueur d'objets, longue date) // Rendez-le disponible si la licence d'un fil donné n'est pas encore disponible. vide statique Unsem (thread thread)
Exemple de verrouillage
La comparaison de "Exemple 1" et "Exemple 2" ci-dessous peut vous donner une compréhension plus claire de l'utilisation de Locksupport.
Exemple 1
classe publique WaitTest1 {public static void main (String [] args) {threada ta = new Threada ("ta"); synchronisé (ta) {// Obtenez le "verrouillage de synchronisation de l'objet ta" via synchronisé (ta) try {System.out.println (thread.currentThread (). getName () + "start ta"); ta.start (); System.out.println (thread.currentThread (). GetName () + "Block"); // Le thread principal attend TA.Wait (); System.out.println (thread.currentThread (). GetName () + "Continuer"); } catch (InterruptedException e) {e.printStackTrace (); }}} classe statique Threada étend Thread {public threada (String name) {super (name); } public void run () {synchronisé (this) {// Obtenez "le verrouillage de synchronisation de l'objet actuel" via synchronisé (this) System.out.println (thread.currentThread (). getName () + "wakup autres"); notify (); // Réveille-toi "Thread d'attente sur l'objet actuel"}}}} Exemple 2
import java.util.concurrent.locks.lockSupport; public class locksupportTest1 {private static thread ganthread; public static void main (String [] args) {threada ta = new Threada ("ta"); // Obtenez le thread principal MainThread = Thread.currentThread (); System.out.println (thread.currentThread (). GetName () + "start ta"); ta.start (); System.out.println (thread.currentThread (). GetName () + "Block"); // le thread principal bloque LocksUpport.Park (Mainthread); System.out.println (thread.currentThread (). GetName () + "Continuer"); } classe statique Threada étend Thread {public threada (String name) {super (name); } public void run () {System.out.println (thread.currentThread (). getName () + "wakup autres"); // Réveille le "fil principal" Locksupport.Unpark (Mainthread); }}} Résultats en cours:
Main Start Tamain Blockta Wakup d'autres autres
Description: La différence entre le parc et l'attente. Avant d'attendre les fils de blocs, le verrouillage de synchronisation doit être obtenu par synchronisé.