Semaphore ส่วนใหญ่จะใช้เพื่อ จำกัด จำนวนคลาสเครื่องมือที่ควบคุมการดำเนินการรหัสพร้อมกันและกำหนดจำนวนการดำเนินการพร้อมกันภายในผ่านใบอนุญาต
/** * ใช้ Semaphore ส่วนประกอบรุ่นที่ไม่ใช่คู่ขนาน */KSEMAPHORE สาธารณะ (ใบอนุญาต int) {sync = ใหม่ nonfairsync (ใบอนุญาต);}/** * ระบุเซมาฟอร์รุ่นเวอร์ชัน */KSEMAPHORE สาธารณะ ใหม่ fairsync (ใบอนุญาต): nonfairsync ใหม่ (ใบอนุญาต);} /** aqs subclass คำจำกัดความหลักรับการปล่อยล็อค*/บทคัดย่อคลาสคงที่ sync ขยาย kabstractqueuedsynchronizer {ส่วนตัวคงที่สุดท้ายสุดท้าย serialversionuid = 1192457210091910933l; / ** * ระบุการอนุญาตเริ่มต้นเซมาฟอร์ */ การซิงค์ (ใบอนุญาต int) {setState (ใบอนุญาต); } / ** * ส่งคืนใบอนุญาตที่เหลือ * / final int getPermits () {return getState (); } / ** * รับอนุญาต * / int สุดท้าย nonfirtryAcquireshared (int ซื้อ) {สำหรับ (;;) {int ที่มีอยู่ = getState (); int ที่เหลือ = พร้อมใช้งาน - ได้รับ; // กำหนดจำนวนใบอนุญาตที่เหลือเพื่อให้ได้มาซึ่งถ้า (เหลืออยู่ <0 || เปรียบเทียบสเทอร์สเตท (มีอยู่, ที่เหลือ)) {// CAS เปลี่ยนสถานะการส่งคืนที่เหลืออยู่; }}}} / ** * ปล่อยล็อค * / การป้องกันบูลีนสุดท้าย tryreaseshared (releases int) {สำหรับ (;;) {int current = getState (); int next = current + releases; if (ถัดไป <ปัจจุบัน) {// overflow โยนข้อผิดพลาดใหม่ ("จำนวนใบอนุญาตสูงสุดเกิน"); } if (pompereanDsetState (ปัจจุบัน, ถัดไป)) {// CAS เปลี่ยนสถานะส่งคืนจริง; }}} โมฆะสุดท้ายลดลง (การลดลงของ int) {// ลดใบอนุญาตสำหรับ (;;) {int current = getState (); int ถัดไป = ปัจจุบัน - การลดลง; if (ถัดไป> ปัจจุบัน) {// underflow โยนข้อผิดพลาดใหม่ ("ใบอนุญาตนับ underflow"); } if (pompereanDsetState (ปัจจุบัน, ถัดไป)) {return; }}}} / ** ตั้งค่าใบอนุญาตเป็น 0* / final int drainpermits () {สำหรับ (;;) {int current = getState (); if (current == 0 || pompereanDsetState (ปัจจุบัน, 0)) {return current; - /*** การโทรหาผู้เข้าร่วมอย่างต่อเนื่องเพื่อให้ได้รับอนุญาตในการตอบสนองต่อการขัดจังหวะ*/โมฆะสาธารณะที่ได้มา () พ่น InterruptedException {sync.acquiresharedinctibly (1);}/*** การเรียกใช้การเรียกใช้การอนุญาตให้ใช้งาน */บูลีนสาธารณะ tryacquire () {return sync.nonfairtaryacquireshared (1)> = 0;}/*** พยายามที่จะได้รับอนุญาตรองรับการหมดเวลาและขัดจังหวะ*/บูลีนสาธารณะ tryacquire (การหมดเวลานาน) การอนุญาต */โมฆะสาธารณะได้มา (ใบอนุญาต int) พ่น InterruptedException {ถ้า (อนุญาต <0) {โยน unleglArgumentException ใหม่ (); } sync.acquiresharedinctibly (ใบอนุญาต);}/** * ได้รับอนุญาตที่ไม่ตอบสนองต่อการขัดจังหวะ */โมฆะสาธารณะได้รับอย่างต่อเนื่อง (ใบอนุญาต int) {ถ้า (อนุญาต <0) โยนใหม่ที่ผิดกฎหมาย ExlargumentException (); sync.acquireshared (ใบอนุญาต);}/** * พยายามรับอนุญาต */public boolean tryacquire (ใบอนุญาต int) {ถ้า (อนุญาต <0) โยน unlegalargumentException ใหม่ (); return sync.nonfirtryacquireshared (ใบอนุญาต)> = 0;}/** * พยายามสนับสนุนกลไกการหมดเวลาสนับสนุนการได้มาของการขัดจังหวะใบอนุญาต */public boolean tryacquire (ใบอนุญาต int, timout ยาว return sync.tryacquiresharednanos (ใบอนุญาต, unit.tonanos (timout));} /** * ใบอนุญาตวางจำหน่าย */โมฆะสาธารณะรีลีส () {sync.releaseshared (1);}/** * ใบอนุญาตวางจำหน่าย */การปล่อยโมฆะสาธารณะ (ใบอนุญาต int) {ถ้า (อนุญาต <0) โยน unlegalargumentException ใหม่ (); sync.releaseshared (ใบอนุญาต);} /** * ส่งคืนใบอนุญาตที่มีอยู่ */public int ที่มีอยู่ () {return sync.getPermits ();}/** * การอนุญาตให้ใช้ */public int drainpermits () {return sync.drainpermits ();}/** * ลดการลดลงของการลดลง sync.reducepermits (การลดลง);}/*** พิจารณาว่ามันเป็นเวอร์ชันที่ยุติธรรม*/บูลีนสาธารณะ isfair () {return sync อินสแตนซ์ของ fairsync;}/*** ส่งคืนด้ายที่รออยู่ในคิวซิงค์ใน aqs*/สาธารณะสุดท้าย AQS*/Public Final int getqueUnEght () {return sync.getqueuelength ();}/***ส่งคืนเธรดที่รออยู่ในคิวซิงค์ใน AQS*/คอลเลกชันที่ได้รับการป้องกันข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น