เมื่อเราพูดถึงความปลอดภัยของด้าย เราจะเลือกวิธีการล็อคมาแก้ไข ประเภทของล็อคใน Java แบ่งออกเป็นหกประเภท วิธีการล็อคที่พบบ่อยที่สุดที่เราพบคือการล็อคและการซิงโครไนซ์ นี่เป็นคำถามเกี่ยวกับหลักการและกลไกที่พบบ่อยที่สุดในการสัมภาษณ์ ด้านล่างนี้เราจะแสดงคำถามสัมภาษณ์ทั่วไปใน Java มาดูกันว่าคุณจะสามารถตอบคำถามทั้งหมดได้หรือไม่
1.ความแตกต่างระหว่างเอฟเฟกต์ซิงโครไนซ์กับวิธีคงที่และวิธีไม่คงที่
วิธีการไม่คงที่:
ล็อควัตถุ (เข้าใจได้ว่าเป็นการล็อคหน่วยความจำของวัตถุนี้ โปรดทราบว่าเป็นเพียงหน่วยความจำนี้ วัตถุอื่นที่คล้ายคลึงกันจะมีการล็อคหน่วยความจำของตัวเอง) ในเวลานี้ วิธีการซิงโครไนซ์ของวัตถุจะดำเนินการมากกว่าหนึ่งวิธี เธรดอื่น (หมายเหตุ: เป็นวัตถุ) จะสร้างการแยกกัน
วิธีคงที่ : เทียบเท่ากับการล็อคคลาส (*.class ตั้งอยู่ในพื้นที่โค้ด และวิธีการคงที่ตั้งอยู่ในพื้นที่คงที่ วัตถุที่สร้างโดยคลาสนี้ใช้วิธีคงที่นี้ร่วมกัน ดังนั้นวัตถุ N จึงแข่งขันกันเพื่อหน่วยความจำนี้)
ในเวลานี้ ตราบใดที่มีการเรียกอ็อบเจ็กต์ที่สร้างโดยคลาสนี้ การยกเว้นร่วมกันจะเกิดขึ้นเมื่อมีการเรียกเมธอดแบบสแตติกนี้ นั่นคือวัตถุทั้งหมดของคลาสนี้มีล็อคร่วมกัน
2.ประเภทล็อคมีอะไรบ้าง?
(1) ล็อคในแง่ดีและล็อคในแง่ร้าย
(2) ล็อคแบบหมุนและล็อคแบบไม่หมุน
(3) ล็อคการกลับเข้าและการล็อคการกลับเข้าใหม่
(4) ล็อคแบบไม่มีล็อคและน้ำหนักเบา & ล็อคแบบเอนเอียงและล็อคแบบเฮฟวี่เวท
(5) ล็อค Mutex และล็อคที่ใช้ร่วมกัน
(6) การล็อคอย่างยุติธรรมและการล็อคที่ไม่ยุติธรรม
3. การซิงโครไนซ์เธรดหลายวิธี
การปรับเปลี่ยนแบบซิงโครไนซ์
การซิงโครไนซ์ดำเนินการระเหย (รับประกันการมองเห็นเท่านั้นไม่ใช่อะตอมมิก)
ใช้ตัวแปรท้องถิ่น ThreadLocal
ใช้คลาสอะตอมมิก ( AtomicInteger, AtomicBoolean...)
ใช้ ล็อค
ใช้คลาสคอนเทนเนอร์ ( BlockingQueue, ConcurrentHashMap)
4. ความแตกต่างระหว่างกลไกการซิงโครไนซ์และการล็อค
การซิงโครไนซ์เดิมใช้กลไกการล็อคในแง่ร้ายของ CPU นั่นคือเธรดได้รับการล็อคแบบเอกสิทธิ์เฉพาะบุคคล การล็อคแบบพิเศษหมายความว่าเธรดอื่นสามารถพึ่งพาการบล็อกเพื่อรอให้เธรดปลดล็อคเท่านั้น
ล็อคใช้การล็อคในแง่ดี สิ่งที่เรียกว่าการล็อกในแง่ดีคือการดำเนินการให้เสร็จสิ้นโดยไม่ต้องล็อกในแต่ละครั้ง แต่สมมติว่าไม่มีข้อขัดแย้ง หากล้มเหลวเนื่องจากข้อขัดแย้ง ระบบจะลองอีกครั้งจนกว่าจะสำเร็จ กลไกในการใช้การล็อคในแง่ดีคือการทำงานของ CAS (เปรียบเทียบและสลับ)
5. พูดคุยเกี่ยวกับปัญหาความปลอดภัยของด้าย
ความปลอดภัยของเธรดเป็นปัญหาในด้านมัลติเธรด ความปลอดภัยของเธรดสามารถเข้าใจได้ง่ายว่าเป็นวิธีการหรืออินสแตนซ์ที่สามารถใช้ได้ในสภาพแวดล้อมแบบมัลติเธรดโดยไม่มีปัญหา
ใน การเขียนโปรแกรมแบบมัลติเธรด Java มีหลายวิธีเพื่อให้บรรลุความปลอดภัยของเธรด Java:
วิธีที่ง่ายที่สุดคือ ใช้ คีย์เวิร์ด Synchronization
ใช้ คลาสอะตอมมิกจากแพ็กเกจ java.util.concurrent.atomic เช่น AtomicInteger
การใช้ การล็อกจากแพ็กเกจ java.util.concurrent.locks
ใช้คอลเลกชัน ConcurrentHashMap ที่ปลอดภัยสำหรับเธรด
ใช้ คำสำคัญที่ผันผวนเพื่อให้แน่ใจว่ามีการมองเห็นตัวแปร
ข้างต้นเป็นการแนะนำคำถามสัมภาษณ์เกี่ยวกับการล็อคใน Java สำหรับประเด็นความรู้ที่คุณไม่ชัดเจน คุณต้องค้นหาข้อมูลให้ทันเวลาเพื่อแก้ไขและเพิ่มหน่วยความจำของเนื้อหาการล็อค