Semaphor wird hauptsächlich verwendet, um die Anzahl der Werkzeugklassen zu begrenzen, die die gleichzeitige Codeausführung steuern, und definiert intern die Anzahl der gleichzeitigen Ausführungen durch eine Genehmigung.
/** * Verwenden Sie nicht faire Versionskomponenten Semaphor */public kSemaphor (int Genehmigungen) {sync = new Nonfairsync (Genehmigungen);}/** * Geben Sie die Versionskomponente Semaphore an */public ksemaphor (int Genehmigungen, boolean fair) {sync = fair? NEUE FAIRSYNC (Genehmigungen): Neue Nicht -Fairsync (Genehmigungen);} /** AQS -Unterklasse Hauptdefinition Get Release Lock*/Abstract statische Klasse Sync erweitert Kabstractquedsynchronizer {private statische endgültige lange Serialversionuid = 1192457210091910933L; / ** * Berechtigung initialisieren semaphor */ sync (int genehmigungen) {setState (Genehmigungen); } / ** * return die verbleibende Genehmigung * / final int getSerMits () {return getState (); } / ** * Erlaubnis erhalten * / endgültig int nonfairtryAcquireshared (int erwirbt) {für (;;) {int verfügbar = getState (); int verbleiben = verfügbar - erwirbt; // Bestimmen Sie die Anzahl der verbleibenden Genehmigungen, um Erwerb zu erhalten. }}}} / ** * Release Lock * / Protected Final Boolean tryreleaseshared (int veröffentlicht) {für (;;) {int current = getState (); int next = current + releases; if (als nächstes <aktuell) {// Überlauf neuer Fehler ("Maximale Zulassungszahl überschritten"); } if (vergleicheStSetState (aktuell, nächstes)) {// cas ändern Status return true; }}} endgültige void recorderMits (int Reduktionen) {// Genehmigungen für (;;) {int current = getState () reduzieren; int Next = Strom - Reduktionen; if (next> current) {// Underlow werfen einen neuen Fehler ("Erlaubniszählung Unterströmung"); } if (vergleicheStSetState (aktuell, next)) {return; }}}} / ** Set -Erlaubnis auf 0* / final int drainPerMits () {für (;;) {int current = getState (); if (current == 0 || vergleicheSetState (current, 0)) {return current; }}}} /*** Rufen Sie AccuciresharedInterrupticley auf, um die Erlaubnis auf Interrupt zu erhalten. */public boolean tryacquire () {return sync.nonfairtryacquiresharedared (1)> = 0;}/*** Versuchen Sie, eine Erlaubnis zu erhalten, Timeout und Interrupt zu unterstützen. Erlaubnis */public void erwerben (int genehmigten) löst InterruptedException aus {if (Genehmigungen <0) {werfen neuer illegalArgumentException (); } sync.acquiresharedinterrupticled (Genehmigungen);}/** * Erhalten Sie die Berechtigung, die nicht auf Interrupts reagiert */public void AcquireUnterriptable (int Genehmigungen) {if (Genehmigungen <0) neue IllegalArgumentException (); sync.acquireshared (Genehmigungen);}/** * Versuchen Sie, die Erlaubnis zu erhalten. Return sync.nonfairtryacquiresharedared (Genehmigungen)> = 0;}/** * Versuchen Sie, den Zeitüberschreitungsmechanismus zu unterstützen, den Erwerb von Interrupts -Erlaubnis zu unterstützen */public boolean tryacquire (int genehmigten, long Timout, TimeUnit Unit) throwededException {if (Erlaubnis <0). Return Sync.tryacquiresharednanos (Genehmigungen, Einheit.Tonanos (Timout));} /** * Release -Erlaubnis */public void release () {sync.releaseshared (1);}/** * Release -Erlaubnis */public void Release (int genehmigt) {if (Genehmigungen <0) neue IllegalArgumentException (); Sync.Releaseshared (Genehmigungen);} /** * verfügbare Erlaubnis zurückgeben */public int verfügbarePerMits () {return sync.getPerMits ();}/** * Konsumentenerlaubnis */public int DrainPerMits () {return sync.drainperMits ();}/** * Reduktionserlaubnis */geschützte VOID -Reduzierung (int Reduktion) {wenn sync.redceperMits (Reduktion);}/*** Bestimmen Sie, ob es sich um eine faire Version handelt. Aqs*/public Final int getQueelength () {return sync.getQueelength ();}/***RECHTEN SIE DEN WARTE WARTE TRIME IN SYNC WANDE IN AQs*/Protected Collection <Thread> getQueueThreads () {return sync.getqueed threads ();}Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.