คำสำคัญที่ซิงโครไนซ์มีประโยชน์สองประการ ประการแรกคือการใช้โดยตรงในคำจำกัดความของวิธีการตามที่แนะนำในบทความ "การใช้คีย์เวิร์ด Synchronized เพื่อซิงโครไนซ์วิธีการเรียน" อีกประเภทหนึ่งคือบล็อกซิงโครไนซ์ เราไม่เพียงแต่สามารถซิงโครไนซ์ตัวแปรอ็อบเจ็กต์ผ่านบล็อกที่ซิงโครไนซ์เท่านั้น คุณยังสามารถใช้บล็อกที่ซิงโครไนซ์เพื่อซิงโครไนซ์วิธีการแบบคงที่และแบบไม่คงที่ในชั้นเรียน
ไวยากรณ์ของบล็อกซิงโครไนซ์มีดังนี้:
คัดลอกรหัสรหัสดังต่อไปนี้:
วิธีการโมฆะสาธารณะ ()
-
-
ซิงโครไนซ์ (การแสดงออก)
-
-
-
-
1. การซิงโครไนซ์วิธีการเรียนแบบไม่คงที่
จากบทความ "การใช้คีย์เวิร์ดที่ซิงโครไนซ์เพื่อซิงโครไนซ์วิธีการเรียน" เรารู้ว่าการใช้คีย์เวิร์ดที่ซิงโครไนซ์เพื่อกำหนดวิธีการจะล็อควิธีแบบคงที่หรือแบบไม่คงที่ทั้งหมดที่กำหนดโดยใช้คีย์เวิร์ดที่ซิงโครไนซ์ในคลาส แต่ไม่ใช่เรื่องง่ายที่จะเข้าใจ หากคุณใช้บล็อกที่ซิงโครไนซ์เพื่อให้ได้เอฟเฟกต์เดียวกัน ก็ไม่ยากที่จะเข้าใจว่าเหตุใดจึงเกิดเอฟเฟกต์นี้ หากคุณต้องการใช้บล็อกที่ซิงโครไนซ์เพื่อล็อควิธีการซิงโครไนซ์ที่ไม่คงที่ทั้งหมดในคลาส คุณต้องใช้สิ่งนี้เป็นพารามิเตอร์ของบล็อกที่ซิงโครไนซ์และส่งผ่านไปยังประเทศบล็อกที่ซิงโครไนซ์ รหัสจะเป็นดังนี้:
ประสานวิธีการที่ไม่คงที่ผ่านบล็อกที่ซิงโครไนซ์
คัดลอกรหัสรหัสดังต่อไปนี้:
SyncBlock คลาสสาธารณะ
-
โมฆะสาธารณะ method1 ()
-
synchronized(this) // เทียบเท่ากับการใช้คีย์เวิร์ดที่ซิงโครไนซ์กับเมธอด method1
-
-
-
-
โมฆะสาธารณะ method2 ()
-
synchronized(this) // เทียบเท่ากับการใช้คีย์เวิร์ดที่ซิงโครไนซ์สำหรับเมธอด method2
-
-
-
-
โมฆะการซิงโครไนซ์สาธารณะ method3 ()
-
-
-
-
ในบล็อกการซิงโครไนซ์โค้ดข้างต้นจะใช้ในวิธีที่ 1 และวิธีที่ 2 วิธีการ 3 ในบรรทัด 017 ยังคงใช้คำสำคัญที่ซิงโครไนซ์เพื่อกำหนดวิธีการ เมื่อใช้อินสแตนซ์คลาส SyncBlock เดียวกัน ตราบใดที่หนึ่งในสามวิธียังคงดำเนินการอยู่ อีกสองวิธีจะถูกบล็อกเนื่องจากไม่ได้รับการล็อคการซิงโครไนซ์ เพื่อให้ได้ผลเช่นเดียวกับคีย์เวิร์ดที่ซิงโครไนซ์เมื่อใช้บล็อกที่ซิงโครไนซ์ โค้ดทั้งหมดจะต้องถูกเขียนในบล็อกที่ซิงโครไนซ์ มิฉะนั้น โค้ดทั้งหมดในวิธีการปัจจุบันจะไม่ถูกซิงโครไนซ์กับวิธีอื่น
นอกเหนือจากการใช้สิ่งนี้เป็นพารามิเตอร์ของบล็อกที่ซิงโครไนซ์แล้ว คุณยังสามารถใช้ SyncBlock.this เป็นพารามิเตอร์ของบล็อกที่ซิงโครไนซ์เพื่อให้ได้เอฟเฟกต์เดียวกัน
เมื่อใช้บล็อกซิงโครไนซ์ในวิธีการของคลาสภายใน (InnerClass) สิ่งนี้แสดงถึงคลาสภายในเท่านั้นและไม่เกี่ยวข้องกับคลาสภายนอก (OuterClass) แต่วิธีการไม่คงที่ของคลาสภายในสามารถซิงโครไนซ์กับวิธีการไม่คงที่ของคลาสภายนอกได้ ตัวอย่างเช่น เพิ่มเมธอด method4 ให้กับคลาสภายใน InnerClass และซิงโครไนซ์เมธอด method4 กับสามวิธีของ SyncBlock รหัสจะเป็นดังนี้:
ซิงโครไนซ์วิธีการไม่คงที่ของคลาสภายในกับวิธีการไม่คงที่ของคลาสภายนอก
คัดลอกรหัสรหัสดังต่อไปนี้:
SyncBlock คลาสสาธารณะ
-
-
คลาสInnerClass
-
โมฆะสาธารณะ method4 ()
-
ซิงโครไนซ์ (SyncBlock.this)
-
-
-
-
-
-
-
ในเวอร์ชันใหม่ของคลาส SyncBlock ข้างต้น วิธีการ 4 ของคลาส InnerClass จะถูกซิงโครไนซ์กับอีกสามวิธีของคลาส SyncBlock ดังนั้น จึงสามารถดำเนินการได้เพียงวิธีเดียวจากสี่วิธี method1, method2, method3 และ method4 ในเวลาเดียวกัน
ไม่ว่าบล็อกการซิงโครไนซ์จะดำเนินการตามปกติหรือออกจากบล็อกการซิงโครไนซ์อย่างผิดปกติเนื่องจากข้อผิดพลาดของโปรแกรม การล็อคการซิงโครไนซ์ที่บล็อกการซิงโครไนซ์ในปัจจุบันจะถูกปล่อยออกมาโดยอัตโนมัติ ดังนั้นคุณจึงไม่ต้องกังวลกับการปลดล็อคการซิงโครไนซ์เมื่อใช้บล็อกที่ซิงโครไนซ์
2. การซิงโครไนซ์วิธีการเรียนแบบคงที่
เนื่องจากเมื่อเรียกใช้เมธอดแบบคงที่ อินสแตนซ์ของวัตถุจึงไม่จำเป็นต้องสร้าง ดังนั้น คุณไม่สามารถใช้สิ่งนี้เพื่อซิงโครไนซ์วิธีการแบบคงที่ แต่คุณต้องใช้วัตถุคลาสเพื่อซิงโครไนซ์วิธีการแบบคงที่ รหัสมีดังนี้:
ประสานวิธีการคงที่ผ่านบล็อกที่ซิงโครไนซ์
คัดลอกรหัสรหัสดังต่อไปนี้:
StaticSyncBlock คลาสสาธารณะ
-
โมฆะคงที่สาธารณะ method1()
-
ซิงโครไนซ์ (StaticSyncBlock.class)
-
-
-
-
โมฆะการซิงโครไนซ์สาธารณะแบบคงที่ method2 ()
-
-
-
-
เมื่อซิงโครไนซ์วิธีการคงที่ คุณสามารถใช้คลาสฟิลด์คงที่ของคลาสเพื่อรับอ็อบเจ็กต์คลาสได้ ในตัวอย่างข้างต้น สามารถดำเนินการได้เพียงวิธีเดียวของวิธีที่ 1 และวิธีที่ 2 ในเวลาเดียวกัน นอกเหนือจากการใช้ฟิลด์คลาสเพื่อรับอ็อบเจ็กต์ Class แล้ว คุณยังสามารถใช้เมธอด getClass ของอินสแตนซ์เพื่อรับอ็อบเจ็กต์ Class ได้อีกด้วย รหัสในตัวอย่างข้างต้นสามารถแก้ไขได้ดังนี้:
ใช้เมธอด getClass เพื่อรับอ็อบเจ็กต์คลาส
คัดลอกรหัสรหัสดังต่อไปนี้:
StaticSyncBlock คลาสสาธารณะ
-
อินสแตนซ์ StaticSyncBlock แบบคงที่สาธารณะ
StaticSyncBlock สาธารณะ ()
-
ตัวอย่าง = นี้;
-
โมฆะคงที่สาธารณะ method1()
-
ซิงโครไนซ์ (instance.getClass())
-
-
-
-
ในโค้ดข้างต้น อินสแตนซ์ของคลาส StaticSyncBlock จะได้รับผ่านอินสแตนซ์แบบคงที่สาธารณะ และวัตถุ Class จะได้รับผ่านวิธี getClass ของอินสแตนซ์นี้ (อินสแตนซ์ทั้งหมดของคลาสจะได้รับวัตถุ Class เดียวกันผ่านวิธี getClass ดังนั้น สามารถเรียกใช้เมธอด getClass ของอินสแตนซ์ใดก็ได้) นอกจากนี้เรายังสามารถซิงโครไนซ์วิธีการแบบคงที่ของคลาสที่แตกต่างกันผ่านวัตถุคลาส เช่นวิธีการแบบคงที่ของคลาสการทดสอบและสองวิธีแบบคงที่ของคลาส StaticSyncBlock รหัสจะเป็นดังนี้:
วิธีการของคลาสการทดสอบจะซิงโครไนซ์กับวิธีการวิธีที่ 1 และวิธีที่ 2 ของคลาส StaticSyncBlock
คัดลอกรหัสรหัสดังต่อไปนี้:
การทดสอบในชั้นเรียนสาธารณะ
-
วิธีการโมฆะคงสาธารณะ ()
-
ซิงโครไนซ์ (StaticSyncBlock.class)
-
-
-
-
หมายเหตุ: เมื่อใช้วิธีการคลาสการซิงโครไนซ์บล็อกแบบซิงโครไนซ์ วิธีการที่ไม่คงที่สามารถใช้สิ่งนี้ในการซิงโครไนซ์ได้ ในขณะที่วิธีสแตติกต้องใช้อ็อบเจ็กต์คลาสเพื่อซิงโครไนซ์ พวกเขาไม่ส่งผลกระทบต่อกัน แน่นอน คุณยังสามารถใช้คลาสอ็อบเจ็กต์ในวิธีการที่ไม่คงที่เพื่อซิงโครไนซ์วิธีการคงที่ได้ แต่ไม่สามารถใช้ในวิธีการแบบคงที่เพื่อซิงโครไนซ์วิธีการที่ไม่คงที่ได้ สิ่งนี้ควรสังเกตเมื่อใช้วิธีการคลาสการซิงโครไนซ์บล็อกแบบซิงโครไนซ์