Semaphore ใน Java คืออะไรและใช้งานอย่างไร

เผยแพร่แล้ว: 2022-05-26

Sun 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:

ข้อดี:

  1. ทำให้เธรดจำนวนมากเข้าถึงส่วนสำคัญได้
  2. สัญญาณเป็นเครื่องไม่เชื่อเรื่องพระเจ้า
  3. สัญญาณจะถูกนำไปใช้ในโค้ดที่ไม่ขึ้นกับเครื่องของไมโครเคอร์เนล
  4. ไม่อนุญาตให้หลายกระบวนการเข้าถึงส่วนสำคัญ
  5. ไม่มีการเสียเวลาในกระบวนการหรือทรัพยากรเนื่องจากมีการรอสัญญาณอยู่เสมอ
  6. พวกมันไม่ขึ้นกับเครื่อง ดังนั้นควรรันในโค้ดที่ไม่ขึ้นกับเครื่องของ microkernel
  7. พวกเขาเปิดใช้งานการจัดการทรัพยากรที่สามารถปรับเปลี่ยนได้

ข้อเสีย:

  1. การผกผันของลำดับความสำคัญเป็นหนึ่งในข้อจำกัดที่สำคัญที่สุดของสัญญาณ
  2. ระบบปฏิบัติการต้องติดตามการเรียกสัญญาณการรอและสัญญาณทั้งหมด
  3. การใช้งานของพวกเขาไม่เคยได้รับคำสั่ง แต่เพียงตามประเพณี
  4. ต้องดำเนินการรอและสัญญาณอย่างถูกต้องเพื่อหลีกเลี่ยงการหยุดชะงักของสัญญาณ
  5. เนื่องจากการเขียนโปรแกรมสัญญาณมีความซับซ้อน จึงมีความเป็นไปได้ที่การยกเว้นร่วมกันอาจไม่สามารถทำได้
  6. นอกจากนี้ยังไม่ใช่กลยุทธ์ที่สมจริงสำหรับแอปพลิเคชันขนาดใหญ่เนื่องจากส่งผลให้เกิดการสูญเสียโมดูลาร์
  7. สัญญาณมีความอ่อนไหวต่อข้อผิดพลาดในการเขียนโปรแกรมมากขึ้น
  8. ข้อผิดพลาดในการเขียนโปรแกรมอาจส่งผลให้เกิดการหยุดชะงักหรือการละเมิดการยกเว้นร่วมกัน

จะใช้ Semaphore เป็น Lock ได้อย่างไร?

สัญญาณสามารถใช้เป็นล็อคใน Java มันหมายความว่ามันจำกัดการเข้าถึงทรัพยากร ในการรับการล็อก เธรดใดๆ ที่ต้องการเข้าถึงทรัพยากรที่ถูกล็อกต้องเรียกใช้ฟังก์ชัน earn() ก่อน หลังจากทำงานเสร็จแล้ว เธรดจะต้องปลดล็อคโดยการเรียกใช้ฟังก์ชัน release() โปรดทราบว่าขอบเขตบนควรตั้งค่าเป็น 1 หลักสูตร PG สำหรับผู้บริหารในการพัฒนาแบบฟูลสแตก จะช่วยให้คุณเชี่ยวชาญทักษะเหล่านี้ทั้งหมด

สรุป

การมีแนวคิดที่ชัดเจนเกี่ยวกับภาษาโปรแกรมอย่าง Java เป็นสิ่งจำเป็นสำหรับอาชีพที่สดใสในฐานะนักพัฒนาซอฟต์แวร์ upGrad มีหลักสูตรหลายหลักสูตรที่อาจช่วยให้คุณมีอาชีพที่สดใส ความเชี่ยวชาญพิเศษด้านการพัฒนาแบบฟูลสแตกจากมหาวิทยาลัย Purude ที่ upGrad จะสอนทักษะทั้งหมดที่จำเป็นต่อการเจริญก้าวหน้าในด้านการพัฒนาซอฟต์แวร์

เรียนรู้ หลักสูตรการพัฒนาซอฟต์แวร์ ออนไลน์จากมหาวิทยาลัยชั้นนำของโลก รับโปรแกรม Executive PG โปรแกรมประกาศนียบัตรขั้นสูง หรือโปรแกรมปริญญาโท เพื่อติดตามอาชีพของคุณอย่างรวดเร็ว

ทำไมเราต้องใช้ Semaphore ใน Java?

สัญญาณเป็นตัวแปรที่ใช้สำหรับการซิงโครไนซ์กระบวนการเพื่อจัดการกระบวนการที่เกิดขึ้นพร้อมกัน นอกจากนี้ยังป้องกันปัญหาการแย่งชิงโดยการควบคุมการเข้าถึงทรัพยากรที่ใช้ร่วมกันโดยกระบวนการหลายขั้นตอนพร้อมกัน

ทำไมเราต้องนับสัญญาณ?

สัญญาณมักใช้เพื่อประสานงานการเข้าถึงทรัพยากร โดยตั้งค่าจำนวนสัญญาณเป็นรายการทรัพยากรทั้งหมด เมื่อมีการให้หรือเพิ่มทรัพยากร เธรดจะเพิ่มจำนวนขึ้นโดยอัตโนมัติ และเมื่อทรัพยากรถูกถอนออก เธรดจะลดจำนวนลงโดยอัตโนมัติ

เหตุใด Semaphore จึงเรียกว่าเครื่องมือซิงโครไนซ์

สัญญาณเป็นตัวแปรจำนวนเต็มโดยพื้นฐานแล้วใช้ร่วมกันโดยหลายเธรด ตัวแปรนี้ใช้ในสภาพแวดล้อมแบบหลายการประมวลผลเพื่อเอาชนะปัญหาส่วนที่สำคัญและสร้างการซิงโครไนซ์กระบวนการ บางครั้งเรียกว่าล็อก mutex

การพัฒนาแบบครบวงจรคืออะไร?

การพัฒนาแบบเต็มสแต็กคือการสร้างส่วนประกอบทั้งส่วนหน้า (ฝั่งไคลเอ็นต์) และส่วนหลัง (ฝั่งเซิร์ฟเวอร์) ของเว็บแอปพลิเคชัน นักพัฒนาเว็บแบบฟูลสแตกสามารถสร้างแอปพลิเคชันและเว็บไซต์ออนไลน์ที่เต็มเปี่ยมได้ พวกเขามีหน้าที่รับผิดชอบส่วนหน้า แบ็กเอนด์ ฐานข้อมูล และการดีบักของแอปพลิเคชันออนไลน์หรือเว็บไซต์