Semaphore ใน Java คืออะไรและใช้งานอย่างไร
เผยแพร่แล้ว: 2022-05-26Sun Microsystems ในปี 1995 นำ Java มาให้เรา ซึ่งเป็นภาษาการเขียนโปรแกรมที่ขึ้นกับการทำงานร่วมกัน คลาสและอ็อบเจ็กต์ และแพลตฟอร์มคอมพิวเตอร์ โปรแกรมและเว็บไซต์จำนวนมากจะไม่ทำงานเว้นแต่คุณจะติดตั้ง Java และมีการพัฒนาอีกมากในแต่ละวัน Java ออกวางตลาดและยกย่องในด้านความเร็ว ความปลอดภัย และความเชื่อถือได้ที่รวดเร็ว เป็นภาษาคอมพิวเตอร์ที่สร้างขึ้นเพื่อใช้ในโลกอินเทอร์เน็ตที่กระจัดกระจายโดยเฉพาะ มันถูกสร้างขึ้นโดยคำนึงถึงการออกแบบของภาษาการเขียนโปรแกรม C ++ แต่ง่ายต่อการใช้และบังคับใช้แนวทางการเขียนโปรแกรมเชิงวัตถุ
โปรแกรม PG สำหรับผู้บริหารในการพัฒนาซอฟต์แวร์ จะ สอนทักษะที่จำเป็นทั้งหมดที่จำเป็นในการทำให้เป็นเลิศใน Java
ตัวอย่างของสัญญาณ:
var mutex ที่ใช้ร่วมกัน: สัญญาณ = 1;
กระบวนการ i
เริ่ม
.
.
P(มิวเท็กซ์);
ดำเนินการ CS;
วี(มิวเท็กซ์);
.
.
จบ;
อะไรทำให้ Java โดดเด่น?
ชุมชนเฉพาะของนักพัฒนา Java สถาปนิก และผู้ที่ชื่นชอบ Java ได้ทำการทดสอบ ขัดเกลา ขยาย และตรวจสอบ Java แม้จะมีรากฐานมาเกือบสองทศวรรษ Java ก็มีการพัฒนาอย่างต่อเนื่องตลอดหลายปีที่ผ่านมา
Java มีวัตถุประสงค์เพื่ออำนวยความสะดวกในการพัฒนาโปรแกรมแบบพกพาที่มีประสิทธิภาพสูงสำหรับระบบคอมพิวเตอร์ที่หลากหลาย ดังนั้นจึงสนับสนุนแนวคิดที่สำคัญของการครอบคลุมการเข้าถึงและการโต้ตอบข้ามแพลตฟอร์ม ธุรกิจสามารถให้บริการเพิ่มเติม เพิ่มประสิทธิภาพการทำงานของผู้ใช้ปลายทาง การสื่อสาร และการทำงานร่วมกัน และลดต้นทุนของแอปพลิเคชันสำหรับองค์กรและผู้บริโภคได้อย่างมากด้วยการทำให้ใช้งานได้ในการตั้งค่าที่แตกต่างกัน
Semaphore ใน Java คืออะไร?
สัญญาณใช้ตัวนับเพื่อควบคุมการเข้าถึงทรัพยากรที่ใช้ร่วมกัน อนุญาตให้เข้าถึงได้หากตัวนับมีขนาดใหญ่กว่าศูนย์ หากค่าเป็น 0 จะถูกปฏิเสธการเข้าถึง ตัวนับการอนุญาตที่ให้การเข้าถึงทรัพยากรที่ใช้ร่วมกัน ดังนั้น ในการเข้าถึงทรัพยากร เธรดต้องได้รับอนุญาตจากสัญญาณก่อน
มันทำงานอย่างไร?
โดยทั่วไป ในขณะที่ใช้สัญญาณ เธรดที่พยายามเข้าถึงทรัพยากรที่ใช้ร่วมกันจะพยายามขออนุญาต ถ้าจำนวนสัญญาณไฟมากกว่าศูนย์ เธรดจะได้รับอนุญาต ทำให้จำนวนสัญญาณลดลง ถ้าไม่เช่นนั้น เธรดจะถูกระงับจนกว่าจะได้รับใบอนุญาต
เมื่อเธรดไม่ต้องการการเข้าถึงทรัพยากรที่ใช้ร่วมกันอีกต่อไป เธรดจะอนุญาต ซึ่งทำให้จำนวนสัญญาณเพิ่มขึ้น หากเธรดอื่นกำลังรอการอนุญาต เธรดนั้นจะได้รับหนึ่งเธรดในขณะนั้น
ประเภทของสัญญาณ
Semaphore ใน java มีสี่ประเภท พวกเขามีดังนี้:
สัญญาณไบนารี :
สัญญาณไบนารียอมรับเฉพาะค่า 0 และ 1 และใช้เพื่อสร้างการยกเว้นร่วมกันและซิงโครไนซ์กิจกรรมที่เกิดขึ้นพร้อมกัน
ตัวอย่างของสัญญาณไบนารี:
คลาสสาธารณะ BinarySemaphoreExample
{
ล็อคบูลีนส่วนตัว = false;
BinarySemaphore (ค่าเริ่มต้น int)
{
ล็อค = (เริ่มต้น == 0);
}
โมฆะที่ซิงโครไนซ์สาธารณะ waitForNotify () พ่น InterruptedException
{
ในขณะที่ (ล็อค)
{
รอ();
}
ล็อค = จริง;
}
โมฆะซิงโครไนซ์สาธารณะ notifyToWakeup()
{
ถ้า (ล็อค)
{
แจ้ง();
}
ล็อค = เท็จ;
}
}
อ่านบทความยอดนิยมของเราเกี่ยวกับการพัฒนาซอฟต์แวร์
วิธีการใช้ Data Abstraction ใน Java? | Inner Class ใน Java คืออะไร? | ตัวระบุ Java: คำจำกัดความ ไวยากรณ์ และตัวอย่าง |
ทำความเข้าใจการห่อหุ้มใน OOPS ด้วยตัวอย่าง | อาร์กิวเมนต์บรรทัดคำสั่งใน C อธิบาย | คุณสมบัติและลักษณะเด่น 10 อันดับแรกของคลาวด์คอมพิวติ้งในปี 2022 |
ความหลากหลายใน Java: แนวคิด ประเภท ลักษณะและตัวอย่าง | แพ็คเกจใน Java และวิธีใช้งาน | บทช่วยสอน Git สำหรับผู้เริ่มต้น: เรียนรู้ Git ตั้งแต่เริ่มต้น |
สัญญาณการนับ :
ในทุกช่วงเวลา ค่าของสัญญาณการนับแสดงถึงจำนวนกระบวนการสูงสุดที่สามารถเข้าถึงพื้นที่วิกฤตได้ในเวลาเดียวกัน
ตัวอย่างของการนับสัญญาณ:
คลาสสาธารณะ CountingSemaphoreExample
{
สัญญาณ int ส่วนตัว = 0;
โมฆะซิงโครไนซ์สาธารณะ take()
{
this.signal++;
this.notify();
}
ปล่อยโมฆะซิงโครไนซ์สาธารณะ () พ่น InterruptedException
{
ในขณะที่ (this.signal == 0)
รอ();
this.signal–;
}
}
สัญญาณหมดเวลา:
สัญญาณตามกำหนดเวลาช่วยให้เธรดทำงานตามระยะเวลาที่กำหนด หลังจากช่วงเวลาหนึ่ง ตัวจับเวลาจะรีเซ็ตและใบอนุญาตอื่นๆ ทั้งหมดจะถูกยกเลิก
ตัวอย่างของสัญญาณหมดเวลา:
class TimedSemaphoresตัวอย่าง
{
สัญญาณ TimedSemaphore ส่วนตัว;
TimedSemaphoreExample(ระยะเวลานาน int slotLimit)
{
สัญญาณ = ใหม่ TimedSemaphore (ระยะเวลา, TimeUnit.SECONDS, slotLimit);
}
บูลีน tryAdd()
{
กลับ semaphore.tryAcquire();
}
int availableSlots()
{
ส่งคืน semaphore.getAvailablePermits ();
}
}
สัญญาณที่ถูก จำกัด :
เราอาจกำหนดขอบเขตบนโดยใช้สัญญาณที่มีขอบเขต ใช้แทนการนับสัญญาณเนื่องจากไม่มีค่าขอบเขตบน ค่าขอบเขตบนแสดงถึงจำนวนสัญญาณสูงสุดที่สามารถจัดเก็บได้
ตัวอย่างของ Bounded semaphore :
คลาสสาธารณะ BoundedSemaphoresตัวอย่าง
{
สัญญาณ int ส่วนตัว = 0;
ขอบเขต int ส่วนตัว = 0;
สาธารณะ BoundedSemaphoreexample (int upperBound)
{
this.bound = ขอบเขตบน;
}
โมฆะสาธารณะที่ซิงโครไนซ์ take() พ่น InterruptedException
{
ในขณะที่ (this.signals == ถูกผูกไว้)
รอ();
this.signals++;
this.notify++;
}
โมฆะสาธารณะ ปล่อยซิงโครไนซ์ () พ่น InterruptedException
{
ในขณะที่ (this.signal == 0)
รอ();
this.signals–;
}
}
สำรวจหลักสูตรวิศวกรรมซอฟต์แวร์ยอดนิยมของเรา
เอสแอล. ไม่ | โปรแกรมพัฒนาซอฟต์แวร์ | |
1 | วิทยาศาสตรมหาบัณฑิตสาขาวิทยาการคอมพิวเตอร์จาก LJMU & IIITB | โปรแกรมใบรับรองความปลอดภัยทางไซเบอร์ของ Caltech CTME |
2 | Bootcamp การพัฒนาเต็มกอง | โปรแกรม PG ใน Blockchain |
3 | Executive Post Graduate Program in Software Development - Specialization in DevOps | ดูหลักสูตรวิศวกรรมซอฟต์แวร์ทั้งหมด |
ลักษณะเฉพาะ:
สัญญาณมีลักษณะดังต่อไปนี้:
- ช่วยให้เธรดสามารถสื่อสารกันได้
- จะช่วยลดระดับของการซิงโครไนซ์ เป็นผลให้มีวิธีการซิงโครไนซ์ระดับต่ำ
- ไม่มีค่าลบในสัญญาณ มีค่าที่สามารถมากกว่าหรือเท่ากับศูนย์ได้
- เราสามารถใช้สัญญาณโดยใช้การดำเนินการทดสอบและขัดจังหวะและดำเนินการโดยใช้ตัวอธิบายไฟล์
ข้อดีและข้อเสียของ Semaphores:
ข้อดี:
- ทำให้เธรดจำนวนมากเข้าถึงส่วนสำคัญได้
- สัญญาณเป็นเครื่องไม่เชื่อเรื่องพระเจ้า
- สัญญาณจะถูกนำไปใช้ในโค้ดที่ไม่ขึ้นกับเครื่องของไมโครเคอร์เนล
- ไม่อนุญาตให้หลายกระบวนการเข้าถึงส่วนสำคัญ
- ไม่มีการเสียเวลาในกระบวนการหรือทรัพยากรเนื่องจากมีการรอสัญญาณอยู่เสมอ
- พวกมันไม่ขึ้นกับเครื่อง ดังนั้นควรรันในโค้ดที่ไม่ขึ้นกับเครื่องของ microkernel
- พวกเขาเปิดใช้งานการจัดการทรัพยากรที่สามารถปรับเปลี่ยนได้
ข้อเสีย:
- การผกผันของลำดับความสำคัญเป็นหนึ่งในข้อจำกัดที่สำคัญที่สุดของสัญญาณ
- ระบบปฏิบัติการต้องติดตามการเรียกสัญญาณการรอและสัญญาณทั้งหมด
- การใช้งานของพวกเขาไม่เคยได้รับคำสั่ง แต่เพียงตามประเพณี
- ต้องดำเนินการรอและสัญญาณอย่างถูกต้องเพื่อหลีกเลี่ยงการหยุดชะงักของสัญญาณ
- เนื่องจากการเขียนโปรแกรมสัญญาณมีความซับซ้อน จึงมีความเป็นไปได้ที่การยกเว้นร่วมกันอาจไม่สามารถทำได้
- นอกจากนี้ยังไม่ใช่กลยุทธ์ที่สมจริงสำหรับแอปพลิเคชันขนาดใหญ่เนื่องจากส่งผลให้เกิดการสูญเสียโมดูลาร์
- สัญญาณมีความอ่อนไหวต่อข้อผิดพลาดในการเขียนโปรแกรมมากขึ้น
- ข้อผิดพลาดในการเขียนโปรแกรมอาจส่งผลให้เกิดการหยุดชะงักหรือการละเมิดการยกเว้นร่วมกัน
จะใช้ Semaphore เป็น Lock ได้อย่างไร?
สัญญาณสามารถใช้เป็นล็อคใน Java มันหมายความว่ามันจำกัดการเข้าถึงทรัพยากร ในการรับการล็อก เธรดใดๆ ที่ต้องการเข้าถึงทรัพยากรที่ถูกล็อกต้องเรียกใช้ฟังก์ชัน earn() ก่อน หลังจากทำงานเสร็จแล้ว เธรดจะต้องปลดล็อคโดยการเรียกใช้ฟังก์ชัน release() โปรดทราบว่าขอบเขตบนควรตั้งค่าเป็น 1 หลักสูตร PG สำหรับผู้บริหารในการพัฒนาแบบฟูลสแตก จะช่วยให้คุณเชี่ยวชาญทักษะเหล่านี้ทั้งหมด
สรุป
การมีแนวคิดที่ชัดเจนเกี่ยวกับภาษาโปรแกรมอย่าง Java เป็นสิ่งจำเป็นสำหรับอาชีพที่สดใสในฐานะนักพัฒนาซอฟต์แวร์ upGrad มีหลักสูตรหลายหลักสูตรที่อาจช่วยให้คุณมีอาชีพที่สดใส ความเชี่ยวชาญพิเศษด้านการพัฒนาแบบฟูลสแตกจากมหาวิทยาลัย Purude ที่ upGrad จะสอนทักษะทั้งหมดที่จำเป็นต่อการเจริญก้าวหน้าในด้านการพัฒนาซอฟต์แวร์
เรียนรู้ หลักสูตรการพัฒนาซอฟต์แวร์ ออนไลน์จากมหาวิทยาลัยชั้นนำของโลก รับโปรแกรม Executive PG โปรแกรมประกาศนียบัตรขั้นสูง หรือโปรแกรมปริญญาโท เพื่อติดตามอาชีพของคุณอย่างรวดเร็ว
ทำไมเราต้องใช้ Semaphore ใน Java?
สัญญาณเป็นตัวแปรที่ใช้สำหรับการซิงโครไนซ์กระบวนการเพื่อจัดการกระบวนการที่เกิดขึ้นพร้อมกัน นอกจากนี้ยังป้องกันปัญหาการแย่งชิงโดยการควบคุมการเข้าถึงทรัพยากรที่ใช้ร่วมกันโดยกระบวนการหลายขั้นตอนพร้อมกัน
ทำไมเราต้องนับสัญญาณ?
สัญญาณมักใช้เพื่อประสานงานการเข้าถึงทรัพยากร โดยตั้งค่าจำนวนสัญญาณเป็นรายการทรัพยากรทั้งหมด เมื่อมีการให้หรือเพิ่มทรัพยากร เธรดจะเพิ่มจำนวนขึ้นโดยอัตโนมัติ และเมื่อทรัพยากรถูกถอนออก เธรดจะลดจำนวนลงโดยอัตโนมัติ
เหตุใด Semaphore จึงเรียกว่าเครื่องมือซิงโครไนซ์
สัญญาณเป็นตัวแปรจำนวนเต็มโดยพื้นฐานแล้วใช้ร่วมกันโดยหลายเธรด ตัวแปรนี้ใช้ในสภาพแวดล้อมแบบหลายการประมวลผลเพื่อเอาชนะปัญหาส่วนที่สำคัญและสร้างการซิงโครไนซ์กระบวนการ บางครั้งเรียกว่าล็อก mutex
การพัฒนาแบบครบวงจรคืออะไร?
การพัฒนาแบบเต็มสแต็กคือการสร้างส่วนประกอบทั้งส่วนหน้า (ฝั่งไคลเอ็นต์) และส่วนหลัง (ฝั่งเซิร์ฟเวอร์) ของเว็บแอปพลิเคชัน นักพัฒนาเว็บแบบฟูลสแตกสามารถสร้างแอปพลิเคชันและเว็บไซต์ออนไลน์ที่เต็มเปี่ยมได้ พวกเขามีหน้าที่รับผิดชอบส่วนหน้า แบ็กเอนด์ ฐานข้อมูล และการดีบักของแอปพลิเคชันออนไลน์หรือเว็บไซต์