วิธีการซิงโครไนซ์ขั้นพื้นฐานที่สุดของ Java คือการใช้คำหลักที่ซิงโครไนซ์เพื่อควบคุมการเข้าถึงวิธีการพร้อมกัน ทุกวิธีที่ประกาศด้วยคำหลักที่ซิงโครไนซ์เป็นส่วนสำคัญ ใน Java มีเพียงหนึ่งในส่วนสำคัญของวัตถุเดียวกันเท่านั้นที่ได้รับอนุญาตให้เข้าถึงในเวลาเดียวกัน
วิธีการคงที่มีพฤติกรรมที่แตกต่างกัน วิธีการคงที่ที่ประกาศด้วยคำหลักที่ซิงโครไนซ์สามารถเข้าถึงได้โดยเธรดการดำเนินการเดียวเท่านั้น แต่เธรดอื่น ๆ สามารถเข้าถึงวิธีการซิงโครไนซ์แบบไม่คงที่ของวัตถุนี้ สิ่งนี้จะต้องระมัดระวังมากเพราะสองเธรดสามารถเข้าถึงวิธีการซิงโครไนซ์สองวิธีที่แตกต่างกันของวัตถุในเวลาเดียวกันนั่นคือหนึ่งในนั้นคือวิธีการซิงโครไนซ์แบบคงที่และอีกวิธีหนึ่งเป็นวิธีที่ไม่เกิดสถิติ หากทั้งสองวิธีเปลี่ยนข้อมูลเดียวกันข้อผิดพลาดที่ไม่สอดคล้องกันจะเกิดขึ้น
ไวยากรณ์ของบล็อกซิงโครไนซ์มีดังนี้:
โมฆะสาธารณะวิธีการ () {ซิงโครไนซ์ (นิพจน์) {}} คำหลักที่ซิงโครไนซ์มีสองครั้ง หนึ่งใช้เฉพาะในคำจำกัดความของวิธีการและอื่น ๆ คือบล็อกที่ซิงโครไนซ์ เราไม่เพียงสามารถใช้ซิงโครไนซ์เพื่อซิงโครไนซ์ตัวแปรวัตถุ แต่คุณยังสามารถใช้ซิงโครไนซ์เพื่อซิงโครไนซ์วิธีการคงที่และวิธีการที่ไม่คงที่ในชั้นเรียน
ครั้งแรก: การซิงโครไนซ์ของวิธีที่ไม่คงที่
จากไวยากรณ์ที่เกี่ยวข้องกับ Java เราสามารถรู้ได้ว่าการใช้คำหลักที่ซิงโครไนซ์เพื่อกำหนดวิธีการจะล็อควิธีการคงที่และวิธีการที่ไม่คงที่ที่กำหนดโดยคำหลัก synchroniezd ในชั้นเรียน แต่นี่เป็นเรื่องยากที่จะเข้าใจ หากคุณต้องการที่จะซิงโครไนซ์บล็อกเพื่อให้ได้เอฟเฟกต์ดังกล่าวมันไม่ยากที่จะเข้าใจว่าทำไมผลกระทบนี้จึงเกิดขึ้น หากคุณใช้การซิงโครไนซ์เพื่อล็อควิธีที่ไม่คงที่ทั้งหมดในคลาสคุณจะต้องใช้สิ่งนี้เป็นพารามิเตอร์ของบล็อกที่ซิงโครไนซ์เพื่อส่งผ่านเข้าไปในบล็อกที่ซิงโครไนซ์ รหัสมีดังนี้:
การทดสอบระดับสาธารณะ {โมฆะสาธารณะวิธีการ 1 () {ซิงโครไนซ์ (นี่) {}} โมฆะโมฆะที่ซิงโครไนซ์สาธารณะ () {}} การทดสอบระดับสาธารณะ {โมฆะโมฆะสาธารณะวิธีการ 1 () {ซิงโครไนซ์ ในรหัสด้านบน Method1 ใช้บล็อกที่ซิงโครไนซ์และวิธีการ Method2 ใช้คำหลักที่ซิงโครไนซ์เพื่อกำหนดวิธี หากคุณใช้อินสแตนซ์การทดสอบเดียวกันตราบใดที่หนึ่งในสองวิธีนี้กำลังดำเนินการวิธีอื่นจะถูกบล็อกเนื่องจากไม่ได้รับการล็อคการซิงโครไนซ์ นอกเหนือจากการใช้สิ่งนี้เป็นพารามิเตอร์ของบล็อกที่ซิงโครไนซ์แล้วคุณยังสามารถใช้การทดสอบได้นี่เป็นพารามิเตอร์ของบล็อกที่ซิงโครไนซ์เพื่อให้ได้เอฟเฟกต์เดียวกัน
ในการใช้บล็อกแบบซิงโครไนซ์ในคลาสภายในสิ่งนี้แสดงถึงคลาสภายในเท่านั้นและไม่มีส่วนเกี่ยวข้องกับคลาสชั้นนอก (OuterClass) อย่างไรก็ตามวิธีการที่ไม่คงที่ในคลาสภายในและวิธีการที่ไม่คงที่ในชั้นนอกสามารถซิงโครไนซ์ได้ หากคุณเพิ่ม Method Method3 ในคลาสด้านในคุณสามารถซิงโครไนซ์กับสองวิธีในการทดสอบรหัสมีดังนี้:
การทดสอบคลาสสาธารณะ {คลาส innerClass {โมฆะสาธารณะวิธีการ 3 () {ซิงโครไนซ์ (test.this) {}}} การทดสอบคลาสสาธารณะ {คลาส innerClass {โมฆะสาธารณะวิธีการ 3 () {ซิงโครไนซ์ (test.this) {}}}}}}}} วิธีการ Method3 ของ InnerClass ด้านบนและวิธีการทดสอบ Method1 และ Method2 สามารถมีวิธีเดียวที่ดำเนินการในเวลาเดียวกันเท่านั้น
ไม่ว่าจะเป็นบล็อกที่ซิงโครไนซ์ถูกเรียกใช้อย่างถูกต้องหรือบล็อกซิงโครไนซ์ถูกปิดเนื่องจากข้อยกเว้นเนื่องจากข้อผิดพลาดของโปรแกรมล็อคการซิงโครไนซ์ที่จัดขึ้นโดยบล็อกซิงโครไนซ์ปัจจุบันจะถูกปล่อยออกมาโดยอัตโนมัติ ดังนั้นคุณไม่ต้องกังวลเกี่ยวกับการล็อคการซิงโครไนซ์เมื่อใช้บล็อกซิงโครไนซ์
2. การซิงโครไนซ์ของวิธีการคงที่
เนื่องจากอินสแตนซ์ของวัตถุไม่จำเป็นต้องสร้างขึ้นเมื่อเรียกใช้วิธีการคงที่สิ่งนี้จึงไม่สามารถใช้เพื่อซิงโครไนซ์วิธีการคงที่ แต่ต้องใช้วัตถุคลาสเพื่อซิงโครไนซ์วิธีการคงที่ รหัสมีดังนี้:
การทดสอบระดับสาธารณะ {โมฆะแบบคงที่สาธารณะวิธีการ 1 () {ซิงโครไนซ์ (test.class) {}} โมฆะแบบสแตติกแบบสแตติกสาธารณะแบบสแตติกแบบคงที่ 2 () {}} การทดสอบระดับสาธารณะเมื่อซิงโครไนซ์วิธีการคงที่คุณสามารถใช้คลาสฟิลด์แบบคงที่ของคลาสเพื่อรับวัตถุคลาส ในตัวอย่างข้างต้นมีวิธีการหนึ่งวิธีการดำเนินการของ Method1 และ Method2 เท่านั้น นอกเหนือจากการใช้ฟิลด์คลาสแล้วคุณยังสามารถรับวัตถุคลาสผ่านวิธี getClass () ของอินสแตนซ์ รหัสมีดังนี้:
การทดสอบระดับสาธารณะ {การทดสอบแบบคงที่สาธารณะ; การทดสอบสาธารณะ () {test = this; } โมฆะคงที่สาธารณะวิธีการ 1 () {ซิงโครไนซ์ (test.getClass ()) {}} การทดสอบระดับสาธารณะ {ทดสอบการทดสอบแบบคงที่สาธารณะ; การทดสอบสาธารณะ () {test = this; } โมฆะแบบคงที่สาธารณะวิธีการ 1 () {ซิงโครไนซ์ (test.getClass ()) {}}}
ในรหัสข้างต้นเราได้รับอินสแตนซ์ของการทดสอบผ่านวัตถุสแตติกสาธารณะและรับวัตถุคลาสผ่านวิธี getClass ของอินสแตนซ์นี้ (โปรดทราบว่าอินสแตนซ์ทั้งหมดของคลาสได้รับผ่านวิธี getClass) นอกจากนี้เรายังสามารถซิงโครไนซ์วิธีการคงที่ของคลาสที่แตกต่างกันผ่านคลาสรหัสมีดังนี้:
ระดับสาธารณะ test1 {โมฆะสาธารณะคงที่วิธีการ 1 () {ซิงโครไนซ์ (test.class) {}}} คลาสสาธารณะ test1 {โมฆะคงที่สาธารณะวิธีการ 1 () {ซิงโครไนซ์ (test.class) {}}}}}}}}}}}}}}}
หมายเหตุ: เมื่อใช้บล็อกซิงโครไนซ์เพื่อซิงโครไนซ์วิธีการที่ไม่คงที่สามารถซิงโครไนซ์ผ่านสิ่งนี้ได้ในขณะที่วิธีการคงที่จะต้องซิงโครไนซ์โดยใช้วัตถุคลาส แต่วิธีที่ไม่คงที่สามารถซิงโครไนซ์ได้โดยใช้คลาส อย่างไรก็ตามสิ่งนี้ไม่สามารถใช้ในวิธีการคงที่เพื่อซิงโครไนซ์วิธีที่ไม่คงที่ สิ่งนี้จะต้องให้ความสนใจเมื่อใช้บล็อกที่ซิงโครไนซ์
บันทึก
คำหลักที่ซิงโครไนซ์จะลดประสิทธิภาพของแอปพลิเคชันและดังนั้นจึงสามารถใช้กับวิธีการที่ต้องแก้ไขข้อมูลที่ใช้ร่วมกันในสถานการณ์ที่เกิดขึ้นพร้อมกันเท่านั้น หากหลายเธรดเข้าถึงวิธีการซิงโครไนซ์เดียวกันมีเพียงหนึ่งเธรดเท่านั้นที่สามารถเข้าถึงได้และเธรดอื่น ๆ จะรอ หากการประกาศวิธีการไม่ใช้คำหลักที่ซิงโครไนซ์เธรดทั้งหมดสามารถเรียกใช้วิธีการในเวลาเดียวกันซึ่งจะช่วยลดเวลาทำงานทั้งหมด หากคุณรู้ว่าถูกเรียกมากกว่าหนึ่งเธรดคุณไม่จำเป็นต้องประกาศโดยใช้คำหลักที่ซิงโครไนซ์
วิธีการที่ประกาศว่าซิงโครไนซ์สามารถเรียกได้ซ้ำ เมื่อเธรดเข้าถึงวิธีการซิงโครไนซ์ของวัตถุมันยังสามารถเรียกวิธีการซิงโครไนซ์อื่น ๆ ของวัตถุรวมถึงวิธีการดำเนินการโดยไม่ต้องเข้าถึงวิธีการอีกครั้ง
เราสามารถป้องกันการเข้าถึงบล็อกรหัส (แทนที่จะเป็นวิธีทั้งหมด) ผ่านคำหลักที่ซิงโครไนซ์ คำหลักที่ซิงโครไนซ์ควรใช้เช่นนี้: ส่วนที่เหลือของวิธีการยังคงอยู่นอกบล็อกรหัสที่ซิงโครไนซ์เพื่อประสิทธิภาพที่ดีขึ้น การเข้าถึงส่วนที่สำคัญ (เช่นบล็อกรหัสที่สามารถเข้าถึงได้โดยเธรดเดียวในเวลาเดียวกัน) ควรสั้นที่สุดเท่าที่จะทำได้ ตัวอย่างเช่นในการดำเนินการของการได้รับจำนวนคนในอาคารเราใช้คำหลักที่ซิงโครไนซ์เท่านั้นเพื่อปกป้องคำแนะนำสำหรับการอัปเดตจำนวนคนและทำให้การดำเนินการอื่นไม่ใช้ข้อมูลที่ใช้ร่วมกัน เมื่อใช้คำหลักที่ซิงโครไนซ์ด้วยวิธีนี้การอ้างอิงวัตถุจะต้องใช้เป็นพารามิเตอร์ที่เข้ามา มีเธรดเพียงหนึ่งเธรดที่สามารถเข้าถึงรหัสที่ซิงโครไนซ์นี้ได้ในเวลาเดียวกัน โดยทั่วไปเราใช้คำหลักนี้เพื่ออ้างถึงวัตถุที่วิธีการที่ถูกดำเนินการเป็นของ:
ซิงโครไนซ์ (นี่) {// java code}