เพียงบันทึกวิธีการใช้คำสำคัญที่ซิงโครไนซ์ใน java
ก่อนการแนะนำ จำเป็นต้องชี้แจงว่าแต่ละอินสแตนซ์อ็อบเจ็กต์ของคลาสใน Java มีและมีการล็อค (ล็อค) เดียวที่เชื่อมโยงอยู่เท่านั้น คีย์เวิร์ดที่ซิงโครไนซ์ทำหน้าที่เฉพาะกับการล็อคนี้ กล่าวคือ ถือว่าซิงโครไนซ์เท่านั้น ส่งผลกระทบต่ออินสแตนซ์วัตถุของคลาส Java
ฟังก์ชั่นแก้ไขที่ซิงโครไนซ์
คัดลอกรหัสรหัสดังต่อไปนี้:
aMethod(){ ซิงโครไนซ์สาธารณะ
-
นี่เป็นสถานการณ์ที่ใช้บ่อยที่สุด ดังนั้นจุดประสงค์ของวิธีการซิงโครไนซ์นี้คืออะไร เพื่อความสะดวก จึงเรียกว่าวิธีเมธอด
1. การล็อคแบบซิงโครไนซ์ใดคืออินสแตนซ์ออบเจ็กต์ที่เรียกใช้วิธีการซิงโครไนซ์นี้ ตัวอย่างเช่น การซิงโครไนซ์จะเกิดขึ้นเมื่ออินสแตนซ์เดียวกัน P1 เรียกเมธอดในเธรดที่ต่างกัน
2. ควรสังเกตว่าอ็อบเจ็กต์ P2 อื่นของคลาสที่อ็อบเจ็กต์นี้อยู่สามารถเรียกวิธีการนี้ได้โดยพลการ เนื่องจากวิธีการซิงโครไนซ์ของอินสแตนซ์อ็อบเจ็กต์ที่แตกต่างกันจะไม่รบกวนซึ่งกันและกัน กล่าวอีกนัยหนึ่ง เธรดอื่นยังคงสามารถเข้าถึงเมธอด aMethod ในอินสแตนซ์อ็อบเจ็กต์อื่นของคลาสเดียวกันในเวลาเดียวกัน
3. หากวัตถุมีวิธีการซิงโครไนซ์หลายวิธี เช่น aMethod, bMethod และ cMethod ตราบใดที่เธรดหนึ่งเข้าถึงวิธีการซิงโครไนซ์วิธีใดวิธีหนึ่ง เธรดอื่นไม่สามารถเข้าถึงวิธีการซิงโครไนซ์ในวัตถุในเวลาเดียวกันได้
รหัสข้างต้นเทียบเท่ากับสิ่งต่อไปนี้:
คัดลอกรหัสรหัสดังต่อไปนี้:
โมฆะสาธารณะ aMethod() {
ซิงโครไนซ์ (สิ่งนี้) {
-
-
ในที่นี้หมายถึงการอ้างอิงของออบเจ็กต์อินสแตนซ์ เช่น P1 จะเห็นได้ว่าสาระสำคัญของวิธีการซิงโครไนซ์คือการใช้การซิงโครไนซ์กับการอ้างอิงวัตถุ เฉพาะเธรดที่ได้รับการล็อควัตถุ P1 เท่านั้นที่สามารถเรียกใช้วิธีการซิงโครไนซ์ของ P1 ได้ สำหรับการล็อค P1 นั้นไม่เกี่ยวข้องกับมันเลย สถานการณ์ทำให้เกิดความสับสนของข้อมูล จากนี้เราได้รับบล็อกการซิงโครไนซ์ด้านล่าง
บล็อกโค้ดที่แก้ไขแล้วแบบซิงโครไนซ์
คัดลอกรหัสรหัสดังต่อไปนี้:
โมฆะสาธารณะ dMethod (SomeObject ดังนั้น) {
ซิงโครไนซ์ (ดังนั้น) {
-
-
ล็อคที่ได้รับจากการซิงโครไนซ์ที่นี่คือล็อคของออบเจ็กต์ so ดังนั้นใครก็ตามที่ได้รับการล็อคสามารถเรียกใช้โค้ดที่เขาควบคุมได้ เมื่อมีวัตถุที่ชัดเจนเป็นตัวล็อค คุณสามารถเขียนโปรแกรมได้แบบนี้ แต่เมื่อไม่มีวัตถุที่ชัดเจนเป็นตัวล็อค และคุณเพียงต้องการซิงโครไนซ์โค้ดเพียงชิ้นเดียว คุณสามารถสร้างตัวแปรอินสแตนซ์พิเศษได้ (ต้องเป็น วัตถุ) เพื่อทำหน้าที่เป็นตัวล็อค:
คัดลอกรหัสรหัสดังต่อไปนี้:
คลาส Foo ใช้ Runnable {
ล็อคไบต์ส่วนตัว [] = ไบต์ใหม่ [0];
วิธีการเป็นโมฆะสาธารณะ () {
ซิงโครไนซ์ (ล็อค) {
-
-
-
ออบเจ็กต์อาร์เรย์ไบต์ที่มีความยาวเป็นศูนย์จะคุ้มต้นทุนในการสร้างมากกว่าออบเจ็กต์อื่นๆ
วิธีการคงที่ที่แก้ไขแบบซิงโครไนซ์
ดังที่กล่าวไว้ก่อนหน้านี้ คีย์เวิร์ดที่ซิงโครไนซ์ใช้ได้เฉพาะกับอินสแตนซ์ P1 ในเธรดที่ต่างกัน แล้วจะใช้ได้กับอินสแตนซ์ที่ต่างกันของ P1 และ P2 ได้อย่างไร คำตอบคือ ใช้วิธีซิงโครไนซ์เพื่อแก้ไขวิธีการคงที่ของ คลาสนี้สามารถพูดได้ว่าคลาสนี้เป็นเจ้าของ มันไม่ได้ขึ้นอยู่กับอินสแตนซ์ของคลาส ดังนั้นเราจึงจำเป็นต้องใช้คีย์เวิร์ดที่ซิงโครไนซ์เพื่อแก้ไขวิธีการคงที่ของคลาสเพื่อให้เกิดการซิงโครไนซ์ระหว่างอินสแตนซ์ที่แตกต่างกัน