يستخدم Semaphore بشكل أساسي للحد من عدد فئات الأدوات التي تتحكم في تنفيذ التعليمات البرمجية المتزامنة ، ويحدد داخليًا عدد عمليات الإعدام المتزامنة من خلال تصريح.
/** * استخدم semaphore المكون من غير القديم */public Ksemaphore (تصاريح int) {sync = new nonfairsync (تصاريح) ؛}/** * تحديد semaphore مكون الإصدار */public ksemaphore (تصاريح int ، معرض Boolean) {sync = fair؟ New Fairsync (تصاريح): New Fairsync (تصاريح) ؛} /** AQS الفئة الفرعية التعريف الرئيسي الحصول على قفل الإصدار*/تجريدي Sync Sync static kabstractqueuedsynchronizer {Private Static Final Long SerialVersionuid = 1192457210091910933L ؛ / ** * حدد الإذن تهيئة Semaphore */ Sync (تصاريح int) {setState (تصاريح) ؛ } / ** * إرجاع التصريح المتبقي * / النهائي int getPermits () {return getState () ؛ } / ** * احصل على إذن * / Final int nonfairtryaCquireshared (int quistres) {for (؛؛) {int Available = getState () ؛ int المتبقية = متاح - اكتساب ؛ // تحديد عدد التصاريح المتبقية للحصول على عمليات الاستحواذ إذا (تبقى <0 || compareAndSetState (متاح ، متبقي)) {// cas تغيير الحالة المتبقية ؛ }}}} / ** * قفل الإصدار * / المحمي النهائي tryreleaseshare (int reease) {for (؛؛) {int current = getState () ؛ int next = current + reedes ؛ إذا (التالي <الحالي) {// Overflow ، رمي خطأ جديد ("تم تجاوز عدد تصريح الحد الأقصى") ؛ } if (CompareAndSetState (current ، next)) {// cas تغيير الحالة الحقيقية ؛ }}} void void النهائي (تخفيضات int) {// تقليل التصاريح لـ (؛؛) {int current = getState () ؛ int التالي = الحالي - التخفيضات ؛ if (next> current) {// underflow remren error new ("complet count underflow") ؛ } if (CompareAndSetState (current ، next)) {return ؛ }}}} / ** set تصريح إلى 0* / نهائي int drainpermits () {for (؛) {int current = getState () ؛ if (current == 0 || compareAndSetState (current ، 0)) {return current ؛ }}}} /**. Boolean TryAcquire () {return sync.nonfairtaryacquireshared (1)> = 0 ؛}/** Void Acquire (int تصاريح) يلقي interruptedException {if (يسمح <0) {رمي جديد alfictalargumentException () ؛ } sync.acquiresharedInterruptilely (تصاريح) ؛}/** * احصل على إذن لا يستجيب للمقاطعات */public void supplustluredructly (int erclits) {if (ermits <0) رمي غير alfictalaRgumentException () ؛) ؛ Sync.acquireshared (تصاريح) ؛}/** * حاول الحصول على إذن */Boolean Public TryAcquire (INT التصاريح) {if (تصاريح <0) رمي غير alfictalargumentException () ؛ إرجاع sync.nonfairtryAcquireshared (تصاريح)> = 0 ؛}/** * حاول دعم آلية المهلة ، ودعم الحصول على مقاطعات تصريح */oolean public tryacquire (التصاريح int ، timout الطويل ، وحدة الوقت) إرجاع sync.tryacquiresharednanos (تصاريح ، unit.tonanos (timout)) ؛} /** * تصريح الإفراج */public void release () {sync.ReleAseshared (1) ؛}/** * تصريح الإفراج */إصدار الفراغ العام (تصاريح int) {if (تصاريح <0) رمي جديد alfictalispumentexception () ؛ sync.releaseshared (تصاريح) ؛} /** * الإرجاع متاح الترخيص */public int inversepermits () {return sync.getpermits () ؛}/** * إذن الاستهلاك *//public int drainpermits () {return sync.drainpermits () ؛}/** * تقليل تصريح التخفيض */void void محمي (int -recudent) sync.reducePermits (تخفيض) ؛}/*** حدد ما إذا كان إصدارًا عادلًا*/public boolean isfair () {return sync eastialof fairsync ؛}/*** إرجاع مؤشر ترابط الانتظار في قائمة انتظار المزامنة في qs*/public final booleansuedtheedsheads () aqs*/public final int getQueuelength () {return sync.getqueuelength () ؛}/***أعد مؤشر ترابط الانتظار في قائمة انتظار المزامنة في AQS*/collection المحمية <froof> getQueuethreads ()ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.