บทความนี้แนะนำจุดความรู้บางอย่างเกี่ยวกับคำหลักที่ซิงโครไนซ์ใน Java multithreading เป็นล็อควัตถุ
การล็อควัตถุที่เรียกว่าหมายถึงการซิงโครไนซ์เพื่อล็อควัตถุบางอย่าง สำหรับการอ้างอิงโปรดดูที่: บทความนี้
1. การวิเคราะห์
ซิงโครไนซ์สามารถแก้ไขวิธีการอินสแตนซ์ดังนี้:
คลาสสาธารณะ myObject {โมฆะโมฆะสาธารณะที่ซิงโครไนซ์ () {// ทำอะไรบางอย่าง .... }ที่นี่ คำหลักที่ซิงโครไนซ์ ล็อควัตถุปัจจุบัน นี่เรียกอีกอย่างว่า Object Lock
ทำไมต้องล็อควัตถุปัจจุบัน? เนื่องจาก Methoda () เป็นวิธีการอินสแตนซ์หากคุณต้องการเรียกใช้ Methoda () คุณต้องเรียกมันในรูปแบบของวัตถุ Method () (obj.methoda (), OBJ เป็นวัตถุของคลาส MyObject, การซิงโครไนซ์หมายถึงการล็อควัตถุ OBJ)
รหัสข้างต้นสามารถเขียนได้เช่นนี้:
คลาสสาธารณะ myObject {โมฆะสาธารณะเมธอด () {ซิงโครไนซ์ (นี่) {// ทำอะไรบางอย่าง .... }}2. คุณสมบัติ
คุณลักษณะที่ชัดเจนของการซิงโครไนซ์คำหลักที่ซิงโครไนซ์คือเมื่อมีการกำหนดวิธีอินสแตนซ์ที่ได้รับการแก้ไขหลายวิธีในคลาส MyObject หากหลายเธรดมีวัตถุเดียวกันของคลาส MyObject วิธีการเหล่านี้สามารถดำเนินการในลักษณะซิงโครนัสเท่านั้น นั่นคือหลังจากดำเนินการวิธีการแก้ไขแบบซิงโครไนซ์แล้ววิธีการปรับเปลี่ยนแบบซิงโครไนซ์อื่นสามารถดำเนินการได้
ดังนี้:
คลาสสาธารณะ MyObject {โมฆะโมฆะสาธารณะที่ซิงโครไนซ์ซิงโครไนซ์ () {// ทำอะไรบางอย่าง .... } โมฆะโมฆะสาธารณะซิงโครไนซ์ () {// ทำสิ่งอื่น}}}มีวิธีการปรับเปลี่ยนสองวิธีในคลาส MyObject
Threada คลาสสาธารณะขยายเธรด {วัตถุ myObject ส่วนตัว; // ละเว้นตัวสร้าง @Override โมฆะสาธารณะเรียกใช้ () {super.run (); Object.methoda (); -เธรด A Executes Methoda ()
Threadb คลาสสาธารณะขยายเธรด {วัตถุ myobject ส่วนตัว; // ละเว้นตัวสร้าง @Override โมฆะสาธารณะเรียกใช้ () {super.run (); Object.methodb (); - เธรด b ดำเนินการ methodb ()
การเรียกใช้คลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {myObject object = new myObject (); // เธรด A และเธรด B ถือวัตถุเดียวกัน: Object Threada a = new Threada (Object); Threadb b = threadb ใหม่ (วัตถุ); A.Start (); B.Start (); -เนื่องจากเธรด A และ Thread B ถือวัตถุวัตถุของคลาส myobject เดียวกันแม้ว่าเธรดทั้งสองนี้จำเป็นต้องเรียกวิธีการที่แตกต่างกันพวกเขาจะต้องซิงโครไนซ์ ตัวอย่างเช่นเธรด B จำเป็นต้องรอเธรด A เพื่อดำเนินการวิธี Methoda () ก่อนที่จะสามารถเรียกใช้วิธี MethodB ()
3. บทสรุป
ดังที่เห็นได้จากด้านบนขอบเขตของการล็อคแบบซิงโครไนซ์ที่อธิบายไว้ในบทความนี้คือวัตถุทั้งหมด หากมีวิธีการซิงโครไนซ์แบบซิงโครไนซ์หลายวิธีในคลาสและหลายเธรดมีวัตถุเดียวกันของคลาส (วัตถุเดียวกันของคลาส) แม้ว่าพวกเขาจะเรียกวิธีการที่แตกต่างกัน
หากไม่มีตัวแปรที่ใช้ร่วมกันระหว่างวิธีการที่ซิงโครไนซ์แต่ละวิธีหรือไม่มีการเชื่อมต่อระหว่างแต่ละวิธี แต่สามารถดำเนินการซิงโครนัสได้จะส่งผลกระทบต่อประสิทธิภาพ
4. แอปพลิเคชัน-ใช้การซิงโครไนซ์เพื่อหลีกเลี่ยงการอ่านข้อมูลสกปรกเนื่องจากข้อมูลไม่สอดคล้องกัน
ตัวอย่างต่อไปนี้:
คลาสสาธารณะ myObject {username string ส่วนตัว = "b"; รหัสผ่านสตริงส่วนตัว = "BB"; โมฆะโมฆะสาธารณะที่ซิงโครไนซ์ (ชื่อผู้ใช้สตริง, รหัสผ่านสตริง) {this.username = ชื่อผู้ใช้; ลอง {thread.sleep (5000); } catch (interruptedException e) {} this.password = รหัสผ่าน; } โมฆะโมฆะสาธารณะที่ซิงโครไนซ์ () {system.out.println ("ชื่อผู้ใช้" + ชื่อผู้ใช้ + ":" + "รหัสผ่าน" + รหัสผ่าน); -Methoda () รับผิดชอบในการเปลี่ยนชื่อผู้ใช้และรหัสผ่าน ในความเป็นจริงชื่อผู้ใช้สอดคล้องกับรหัสผ่าน
MethodB () รับผิดชอบในการอ่านชื่อผู้ใช้และรหัสผ่าน
หาก MethodB () ไม่ได้รับการแก้ไขด้วยการซิงโครไนซ์ให้ทำการเปลี่ยนชื่อผู้ใช้เมื่อเรียก Methoda () เป็นบรรทัดที่ 7 และให้ CPU ด้วยเหตุผลบางอย่าง (เช่นการนอนหลับบนบรรทัดที่ 9)
ในเวลานี้หากเธรด B ดำเนินการ MethodB () ชื่อผู้ใช้ที่อ่านคือชื่อผู้ใช้ที่เปลี่ยนไปโดยเธรด A ("A") แต่รหัสผ่านเป็นรหัสผ่านดั้งเดิม ("BB") เพราะเธรด A กำลังนอนหลับและไม่มีเวลาเปลี่ยนรหัสผ่าน
อย่างไรก็ตามหาก MethodB () ได้รับการแก้ไขด้วยการซิงโครไนซ์เธรด B สามารถรอเธรด A เพื่อดำเนินการเสร็จสมบูรณ์ (นั่นคือมีการเปลี่ยนชื่อผู้ใช้และรหัสผ่าน) ก่อนที่จะดำเนินการ MethodB เพื่ออ่านชื่อผู้ใช้และรหัสผ่าน ดังนั้นปัญหาการอ่านที่สกปรกที่เกิดจากความไม่สอดคล้องกันในข้อมูลจึงถูกหลีกเลี่ยง
ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ฉันหวังว่ามันจะเป็นประโยชน์สำหรับทุกคนในการเรียนรู้การเขียนโปรแกรม Java