คู่มือที่ครอบคลุมสำหรับการซิงโครไนซ์ใน Java
เผยแพร่แล้ว: 2022-05-20ก่อนที่เราจะอธิบาย การซิงโครไนซ์ใน Java เราต้องทบทวนแนวคิดของมัลติเธรดดิ้งโดยสังเขปเสียก่อน คุณลักษณะมัลติเธรดของ Java ช่วยให้สามารถเรียกใช้งานโปรแกรมตั้งแต่สองส่วนขึ้นไปพร้อมกันเพื่อการใช้งาน CPU สูงสุด แต่ละส่วนของโปรแกรมดังกล่าวเป็นเธรด และเธรดเป็นกระบวนการที่มีน้ำหนักเบาภายในกระบวนการ
ขณะนี้ หลายเธรดของโปรแกรมอาจพยายามเข้าถึงทรัพยากรเดียวกันและให้ผลลัพธ์ที่ไม่ถูกต้อง ดังนั้นจะต้องมีการซิงโครไนซ์บางอย่างเพื่อให้แน่ใจว่ามีเพียงเธรดเดียวเท่านั้นที่สามารถเข้าถึงทรัพยากร ณ เวลาที่กำหนด
คู่มือนี้ อธิบายว่าการซิงโครไนซ์คืออะไรใน Java จะสำรวจแนวคิดของการซิงโครไนซ์โดยละเอียดพร้อมตัวอย่าง
การซิงโครไนซ์ใน Java คืออะไร?
การซิงโครไนซ์ Java คือความสามารถในการควบคุมการเข้าถึงหลายเธรดไปยังทรัพยากรที่ใช้ร่วมกัน มีประโยชน์เมื่อโปรแกรม Java แบบมัลติเธรดพยายามเข้าถึงทรัพยากรเดียวกันและสร้างผลลัพธ์ที่ผิดพลาด การใช้คุณลักษณะการซิงโครไนซ์ Java มีเพียงเธรดเดียวเท่านั้นที่สามารถเข้าถึงทรัพยากร ณ จุดเวลาที่กำหนด
Java จัดเตรียมวิธีการซิงโครไนซ์งานของเธรดโดยใช้บล็อกที่ซิงโครไนซ์ที่ซิงโครไนซ์บนอ็อบเจ็กต์เดียวกัน และสามารถมีเธรดที่ดำเนินการภายในได้ครั้งละหนึ่งเธรดเท่านั้น บล็อกเหล่านี้ถูกทำเครื่องหมายด้วยคีย์เวิร์ดที่ซิงโครไนซ์ ซึ่งจะบล็อกเธรดอื่นที่พยายามจะเข้าไปในบล็อกที่ซิงโครไนซ์จนกว่าเธรดที่อยู่ในบล็อกจะสิ้นสุดการดำเนินการและออกจากบล็อก
ไวยากรณ์สำหรับการเขียน Synchronized Block
ไวยากรณ์ทั่วไปสำหรับการเขียนบล็อกที่ซิงโครไนซ์ใน Java มีดังนี้:
ซิงโครไนซ์ ( lockObject )
{
// คำสั่งซิงโครไนซ์
}
ในไวยากรณ์ข้างต้น lockObject หมายถึงอ็อบเจ็กต์ที่มีการล็อกที่เกี่ยวข้องกับองค์ประกอบที่ซิงโครไนซ์ นั่นนำเราไปสู่แนวคิดการล็อกใน Java
ล็อคใน Java
การซิงโครไนซ์ใน Java สร้างขึ้นจากการล็อกหรือมอนิเตอร์ ทุกอ็อบเจ็กต์มีการล็อคที่เกี่ยวข้อง ตามหลักการแล้ว เธรดที่ต้องการการเข้าถึงฟิลด์ของอ็อบเจ็กต์ต้องได้รับการล็อกของอ็อบเจ็กต์ก่อน ล็อคเป็นกลไกการซิงโครไนซ์เธรดที่ซับซ้อนและยืดหยุ่นกว่าบล็อกการซิงโครไนซ์ มีการกำหนดไว้ในแพ็คเกจ java.util.concurrent.lock ที่มีการใช้งานการล็อกอย่างกว้างขวาง
เรียนรู้หลักสูตรการพัฒนาซอฟต์แวร์ออนไลน์จากมหาวิทยาลัยชั้นนำของโลก รับโปรแกรม PG สำหรับผู้บริหาร โปรแกรมประกาศนียบัตรขั้นสูง หรือโปรแกรมปริญญาโท เพื่อติดตามอาชีพของคุณอย่างรวดเร็ว
Java Synchronized Method
วัตถุประสงค์ของวิธีการซิงโครไนซ์ Java คือการล็อกอ็อบเจ็กต์สำหรับทรัพยากรที่ใช้ร่วมกัน ดังนั้น เมื่อเธรดเรียกใช้เมธอดที่ซิงโครไนซ์ เมธอดจะล็อกสำหรับอ็อบเจ็กต์นั้นโดยอัตโนมัติและปล่อยเมื่อเธรดรันงาน
นี่คือตัวอย่างของวิธีการซิงโครไนซ์ของ Java:
//ตัวอย่างวิธีการซิงโครไนซ์จาวา
ตารางเรียน{
ซิงโครไนซ์โมฆะ printTable(int n){//วิธีการซิงโครไนซ์
สำหรับ (int i=1;i<=5;i++){
System.out.println(n*i);
ลอง{
เธรด. สลีป (400);
}จับ(ข้อยกเว้น จ){System.out.println(e);}
}
}
}
คลาส MyThread1 ขยายเธรด{
ยาเม็ด;
MyThread1 (ตาราง t){
this.t=t;
}
โมฆะสาธารณะ () {
t.printTable(5);
}
}
คลาส MyThread2 ขยายเธรด{
ยาเม็ด;
MyThread2 (ตาราง t){
this.t=t;
}
โมฆะสาธารณะ () {
t.printTable(100);
}
}
คลาสสาธารณะ TestSynchronization2{
โมฆะคงที่สาธารณะหลัก (สตริง args[]){
ตาราง obj = ตารางใหม่ ();// เพียงหนึ่งวัตถุ
MyThread1 t1=ใหม่ MyThread1(obj);
MyThread2 t2=ใหม่ MyThread2(obj);
t1.start();
t2.start();
}
}
เอาท์พุท:
5
10
15
20
25
100
200
300
400
500
จะเกิดอะไรขึ้นหากไม่มีการซิงโครไนซ์
ตอนนี้ มาดูโปรแกรมก่อนหน้าที่ไม่มีการซิงโครไนซ์กัน (สังเกตว่าไม่มีคีย์เวิร์ดที่ซิงโครไนซ์)
ตารางเรียน{
โมฆะ printTable(int n){// วิธีไม่ซิงโครไนซ์
สำหรับ (int i=1;i<=5;i++){
System.out.println(n*i);
ลอง{
เธรด. สลีป (400);
}จับ(ข้อยกเว้น จ){System.out.println(e);}
}
}
}
คลาส MyThread1 ขยายเธรด{
ยาเม็ด;
MyThread1 (ตาราง t){
this.t=t;
}
โมฆะสาธารณะ () {
t.printTable(5);
}
}
คลาส MyThread2 ขยายเธรด{
ยาเม็ด;
MyThread2 (ตาราง t){
this.t=t;
}
โมฆะสาธารณะ () {
t.printTable(100);
}
}
คลาส Testการซิงโครไนซ์1{
โมฆะคงที่สาธารณะหลัก (สตริง args[]){
ตาราง obj = ตารางใหม่ ();// เพียงหนึ่งวัตถุ
MyThread1 t1=ใหม่ MyThread1(obj);
MyThread2 t2=ใหม่ MyThread2(obj);
t1.start();
t2.start();
}
}
เอาท์พุท:
5
100
10
200
15
300
20
400
25
500
อย่างที่คุณเห็น ผลลัพธ์ไม่สอดคล้องกันหากไม่มีการซิงโครไนซ์
สำรวจหลักสูตรวิศวกรรมซอฟต์แวร์ยอดนิยมของเรา
เอสแอล. ไม่ | โปรแกรมพัฒนาซอฟต์แวร์ | |
1 | วิทยาศาสตรมหาบัณฑิตสาขาวิทยาการคอมพิวเตอร์จาก LJMU & IIITB | โปรแกรมใบรับรองความปลอดภัยทางไซเบอร์ของ Caltech CTME |
2 | Bootcamp การพัฒนาเต็มกอง | โปรแกรม PG ใน Blockchain |
3 | Executive Post Graduate Program in Software Development - Specialization in DevOps | ดูหลักสูตรวิศวกรรมซอฟต์แวร์ทั้งหมด |
ประเภทของการซิงโครไนซ์ใน Java
เพื่อตอบคำถาม ว่าการซิงโครไนซ์เธรดใน Java คืออะไร เรามีการซิงโครไนซ์สองประเภท: การซิงโครไนซ์เธรดและการซิงโครไนซ์กระบวนการ
มาทำความเข้าใจความหมายของแต่ละอย่างกัน
การซิงโครไนซ์เธรด: เมื่อหลายเธรดพยายามเข้าถึงทรัพยากรที่ใช้ร่วมกัน เราต้องแน่ใจว่าทรัพยากรนั้นถูกใช้โดยเธรดเดียวเท่านั้นในแต่ละครั้ง การซิงโครไนซ์เธรดเป็นกระบวนการที่อนุญาตให้เธรดเดียวเท่านั้นใช้ทรัพยากรที่ใช้ร่วมกันเมื่อหลายเธรดพยายามใช้ทรัพยากรพร้อมกัน
การซิงโครไนซ์กระบวนการ: หมายถึงการดำเนินการพร้อมกันของหลายกระบวนการเพื่อเข้าถึงสถานะที่กระบวนการดำเนินการตามคำสั่งของการดำเนินการที่เหมาะสม จำเป็นต้องมีการซิงโครไนซ์กระบวนการเมื่อกระบวนการตั้งแต่สองกระบวนการขึ้นไปร่วมมือกัน และการดำเนินการของกระบวนการหนึ่งมีผลกับอีกกระบวนการหนึ่ง ดังนั้น การซิงโครไนซ์กระบวนการจึงขจัดความเป็นไปได้ของผลลัพธ์ที่ไม่ถูกต้อง และรับประกันลำดับการดำเนินการที่เหมาะสม
วิธีการซิงโครไนซ์ใน Java
โดยทั่วไปมีสี่วิธีในการซิงโครไนซ์ใน Java:
- วิธีการซิงโครไนซ์แบบคงที่
- วิธีการซิงโครไนซ์อินสแตนซ์
- บล็อกที่ซิงโครไนซ์ภายในวิธีการแบบคงที่
- บล็อกที่ซิงโครไนซ์ภายในเมธอดอินสแตนซ์
มาดูวิธีการซิงโครไนซ์ Java แต่ละวิธีโดยละเอียดกันดีกว่า
วิธีการซิงโครไนซ์แบบคงที่
ในที่นี้ เราใช้คีย์เวิร์ดที่ซิงโครไนซ์เพื่อทำเครื่องหมายเมธอดแบบสแตติกใน Java ต่อไปนี้คือตัวอย่างวิธีการซิงโครไนซ์แบบสแตติกของ Java:
MyStaticCounter แบบคงที่สาธารณะ {
จำนวน int คงที่ส่วนตัว = 0;
สาธารณะเพิ่มขึ้นโมฆะซิงโครไนซ์แบบคงที่ (ค่า int) {
นับ += ค่า;
}
}
วิธีการซิงโครไนซ์อินสแตนซ์
เมื่อใช้บล็อกที่ซิงโครไนซ์กับเมธอดของอินสแตนซ์ แต่ละอ็อบเจ็กต์จะมีวิธีการซิงโครไนซ์ แต่ละอ็อบเจ็กต์สามารถมีเธรดเดียวเท่านั้นที่สามารถดำเนินการภายในเมธอด หากมีหลายอ็อบเจ็กต์ เธรดเดียวสามารถดำเนินการสำหรับแต่ละอ็อบเจ็กต์ภายในบล็อกได้
MyCounter คลาสสาธารณะ {
จำนวน int ส่วนตัว = 0;
การเพิ่มโมฆะซิงโครไนซ์สาธารณะ (ค่า int) {
this.count += ค่า;
}
การลดโมฆะซิงโครไนซ์สาธารณะ (ค่า int) {
this.count -= ค่า;
}
}
บล็อกที่ซิงโครไนซ์ภายในวิธีการแบบคงที่
ด้านล่างนี้เป็นตัวอย่างที่เราใช้บล็อกที่ซิงโครไนซ์ภายในวิธีการแบบคงที่:
MyClass คลาสสาธารณะ {
พิมพ์โมฆะคงที่สาธารณะ (ข้อความสตริง) {
ซิงโครไนซ์ (MyClass.class) {
log.writeln(ข้อความ);
}
}
}
บล็อกที่ซิงโครไนซ์ภายในเมธอดอินสแตนซ์
แทนที่จะซิงโครไนซ์วิธีการทั้งหมด เราสามารถใช้การซิงโครไนซ์กับบล็อกเฉพาะภายในเมธอด ด้านล่างนี้เป็นตัวอย่างของบล็อกโค้ดที่ซิงโครไนซ์ภายในเมธอดที่ไม่ซิงโครไนซ์:
การเพิ่มโมฆะสาธารณะ (ค่า int) {
ซิงโครไนซ์ (นี้) {
this.count += ค่า;
}
}
ต้องการการซิงโครไนซ์ใน Java
ตอนนี้คุณรู้แล้ว ว่าการซิงโครไนซ์ใน Java คืออะไร คุณอาจสงสัยว่าทำไมเราถึงใช้มันตั้งแต่แรก
คีย์เวิร์ดที่ซิงโครไนซ์ของ Java จัดเตรียมฟังก์ชันที่จำเป็นสำหรับการเขียนโปรแกรมพร้อมกัน การซิงโครไนซ์ใน Java ช่วยได้ดังนี้:
- การซิงโครไนซ์ Java จัดเตรียมคุณลักษณะการล็อกเพื่อขจัดสภาวะการแย่งชิงระหว่างเธรด และตรวจสอบให้แน่ใจว่ามีการเข้าถึงรีซอร์สที่แบ่งใช้ร่วมกัน
- การล็อกแบบซิงโครไนซ์ของ Java มีทั้งคุณลักษณะการล็อกและการปลดล็อก ดังนั้น เธรดจะต้องได้รับล็อกก่อนที่จะเข้าสู่วิธีการซิงโครไนซ์หรือบล็อก
- คีย์เวิร์ดที่ซิงโครไนซ์ป้องกันการจัดลำดับคำสั่งโปรแกรมใหม่โดยคอมไพเลอร์
บทสรุป
สรุปได้ว่าการซิงโครไนซ์ใน Java ทำให้แน่ใจว่ามีเพียงเธรดเดียวเท่านั้นที่สามารถเข้าถึงทรัพยากรที่ใช้ร่วมกันในแต่ละครั้ง เราสามารถสร้างบล็อกหรือวิธีการซิงโครไนซ์โดยใช้คำสำคัญที่ซิงโครไนซ์ของ Java เมื่อเธรดต้องการเข้าไปในบล็อกที่ซิงโครไนซ์ เธรดนั้นต้องได้รับล็อก และหลังจากออกจากบล็อก เธรดจะปลดล็อก เราสามารถใช้คีย์เวิร์ดที่ซิงโครไนซ์กับเมธอดหรือภายในบล็อกของเมธอด
สงสัยว่าจะเรียน Java ที่ไหน?
การรับรอง PG ที่เชื่อมโยงกับงานของ upGrad ในสาขาวิศวกรรมซอฟต์แวร์ คือสิ่งที่คุณกำลังมองหา!
การรับรอง PG ที่เชื่อมโยงกับงานของ upGrad ในสาขาวิศวกรรมซอฟต์แวร์ ได้รับการออกแบบมาเป็นพิเศษสำหรับนักศึกษาจบใหม่และปีสุดท้าย ซึ่ง เหมาะอย่างยิ่งสำหรับผู้ที่ต้องการเรียนรู้การเขียนโปรแกรมและรับตำแหน่งในบทบาทซอฟต์แวร์ระดับเริ่มต้น โปรแกรมออนไลน์ 5 เดือนนี้จะสอนทักษะซอฟต์แวร์ชั้นนำ เช่น Java, JavaScript, HTML5, DSA, AWS, MERN และอีกมากมาย!
ถาม: เหตุใดเราจึงใช้การซิงโครไนซ์ใน Java
ตอบ: คีย์เวิร์ดที่ซิงโครไนซ์ใน Java ช่วยให้แน่ใจว่าเธรดเดียวเท่านั้นที่สามารถเข้าถึงทรัพยากรที่ใช้ร่วมกันในแต่ละครั้ง มีประโยชน์เมื่อโปรแกรม Java แบบมัลติเธรดพยายามเข้าถึงทรัพยากรเดียวกันและสร้างผลลัพธ์ที่ไม่ถูกต้อง
ถาม: การซิงโครไนซ์ถูกนำไปใช้ใน Java อย่างไร
ตอบ: Java ใช้การซิงโครไนซ์โดยใช้แนวคิดของการมอนิเตอร์โดยมีเธรดเดียวเท่านั้นที่เป็นเจ้าของมอนิเตอร์ในเวลาที่กำหนด เมื่อเธรดได้รับการล็อค เธรดจะสามารถเข้าถึงมอนิเตอร์ได้ และเธรดอื่น ๆ ทั้งหมดที่พยายามจะเข้าไปในมอนิเตอร์ที่ถูกล็อคจะยังคงถูกบล็อกจนกว่าเธรดแรกจะออกจากมอนิเตอร์
ถาม: การหยุดชะงักใน Java คืออะไร
ตอบ: การชะงักงันของ Java เกิดขึ้นเมื่อเธรดกำลังรอการล็อกอ็อบเจ็กต์ แต่เธรดอื่นได้รับมา และเธรดที่สองกำลังรอการล็อกอ็อบเจ็กต์ที่ได้รับจากอันแรก ดังนั้น เธรดทั้งสองจึงรอให้กันคลายล็อก ส่งผลให้เกิดการหยุดชะงัก