12
votes

Toute utilisation pratique de Locksupport & Abstract TrembleSynchroniseur?

gars, quelqu'un peut-il donner un exemple simple pratique de locksupport & abstracttiqueSuSynchronizer Utiliser? Exemple donné dans Javadocs est assez tendu.

Utilisation de Semaphore Les permis sont compris par moi.

Merci pour toute réponse.


0 commentaires

5 Réponses :


15
votes

Si vous parlez d'utiliser un mécanisme de verrouillage (ou même des barrières de synchronisation), utilisez simplement un java.util.concurrent.lock . La suggestion évidente est d'utiliser un reentrantlock quels délégués à un Synch . Le synchronisation est un AQS qui utilise à son tour locksupport .

C'est tout fait sous les couvertures pour vous.

EDIT:

Non, passons sur les utilisations pratiques de abstractoStueSuiseSynchroniseur (AQS).

Constructions de la concurrence, mais peut être très différente dans leur utilisation tout peut avoir les mêmes fonctions sous-jacentes.

I.e. Sous certains conditions Park, ce fil. Sous une autre condition, réveille un filetage.

Il s'agit d'un ensemble d'instructions très vastes, mais il est évident que la plupart des structures de concurrence auraient besoin de certaines fonctionnalités communes qui seraient capables de gérer ces opérations. Entrez des AQS. Il y a cinq barrières de synchronisation majeures.

  • reentrantlock
  • Readock
  • writelock
  • SEMAPHORE
  • compteditiqueLatch

    Maintenant, toutes ces cinq structures ont un ensemble de règles très différent lors de leur utilisation. Un CountownLatch peut permettre à de nombreux filets de s'exécuter en même temps, mais oblige une (ou plusieurs) fils à attendre jusqu'à ce que au moins N nombre de threads comptent sur ledit loquet.

    reentrantlock ne force qu'un seul fil à la fois pour entrer une section critique et les files d'attente de tous les autres threads pour attendre que cela soit terminé.

    READOCK Permet un nombre de fils de lecture dans la section critique jusqu'à ce qu'un verrouillage écriture soit acquier.

    Les exemples peuvent continuer, mais la grande image ici est qu'elles utilisent tous des AQs. En effet, ils sont capables d'utiliser les fonctions primitives que AQS offre et implémente une fonctionnalité plus complexe sur le dessus. AQS vous permet de parcourir des threads d'imprécis et de réveil (de manière interruptible si besoin d'être) mais de telle manière que vous pouvez prendre en charge de nombreuses fonctions complexes.


3 commentaires

W. Je voulais juste voir un morceau de code illustratif pour cela ...


@Max LocksUpport est une classe d'utilitaire que tout le monde peut utiliser. Ce n'est pas nécessairement une classe interne dangereux.java est un bon exemple de classe interne. LocksUpport est public pour que d'autres puissent écrire leur propre version de AQS


W.: Merci John, je sais que c'est pour la prolongation. Votre réponse m'a fait reformuler une question: Généralement, l'utilisation de abstractotiesseSynchroniseur semble vague pour moi.



1
votes

Ils ne sont pas destinés à une utilisation directe dans le code du client; plus pour aider à construire de nouvelles classes simultanées.


0 commentaires

1
votes

AQS est une classe merveilleuse pour construire des primitives de concurrence - mais il est complexe et nécessite un peu d'étude pour l'utiliser correctement. Je l'ai utilisé pour quelques choses comme Initialisation paresseuse et un simple rapide Loquet réutilisable .

aussi complexe que c'est, je ne pense pas que les AQs sont particulièrement vagues, il a d'excellents Javadocs décrivant comment l'utiliser correctement.


2 commentaires

java.util.concurrent.abstracttiqueEcèdeSynchroniseur


En fait: java.util.concurrent.locks.AbRacttiqueChroniseur



0
votes

AFAIK, Abstract TremedSynchroniseur est utilisé pour gérer les transitions de l'état. Le JDK l'utilise pour étendre la synchronisation, une classe interne pour Java.Util.ConCurrent.FuTureTask. La classe de synchronisation gère les états (prêts, courir, couru et annulé) de FutureTask et les transitions entre eux.

Ceci permet, comme vous le savez peut-être, futueTask de bloquer sur futueTask.get () jusqu'à ce que l'état de RAN soit atteint, par exemple.


0 commentaires

1
votes

2.7 La libération du perturbateur utilise Locksupport.parknanos au lieu de thread.sleep pour réduire la latence:

http://code.google.com/p/disrupturdor/


0 commentaires