ต่อไปนี้เป็นคำถามที่ฉันถามผู้สัมภาษณ์เมื่อเร็ว ๆ นี้ว่าพวกเขารู้จักการทำงานพร้อมกันของ Java:
- อธิบายถึงอันตรายของ "การมองเห็นของหน่วยความจำ" - วิธีที่ JVM สามารถเรียงลำดับการดำเนินการบางอย่างกับตัวแปรที่ไม่ได้รับการป้องกันโดยจอภาพและไม่ได้ประกาศ
volatile
เช่นว่าเธรดหนึ่งอาจไม่เห็นการเปลี่ยนแปลงของเธรดอื่น ฉันมักจะถามรหัสนี้โดยแสดงรหัสที่อันตรายนี้มีอยู่ (NoVisibility
ตัวอย่างเช่นในรายการ 3.1 จาก "Java Concurrency in Practice" โดย Goetz et al) และถามสิ่งที่ผิด - อธิบายว่า
volatile
มีผลกระทบอย่างไรกับตัวแปรที่เกิดขึ้นจริงที่ประกาศvolatile
แต่ยังรวมถึงการเปลี่ยนแปลงตัวแปรที่ทำโดยเธรดก่อนที่จะเปลี่ยนแปลงvolatile
ตัวแปร - ทำไมคุณอาจใช้
volatile
แทนsynchronized
? - ใช้ตัวแปรสภาพด้วยและ
wait()
อธิบายว่าทำไมคุณควรใช้notifyAll()
notifyAll()
อธิบายว่าทำไมตัวแปรเงื่อนไขควรทดสอบด้วยการwhile
วนซ้ำ
คำถามของฉันคือ - สิ่งเหล่านี้เหมาะสมหรือสูงเกินไปที่จะถามคนที่บอกว่าพวกเขารู้จักการทำงานพร้อมกันของ Java หรือไม่
และในขณะที่เราอยู่ที่นี่คุณคิดว่าคนที่ทำงานใน Java เห็นพ้องด้วยควรคาดว่าจะมีความรู้สูงกว่าค่าเฉลี่ยของการเก็บขยะ Java?
notifyAll()
กับ "ฉันไม่เชื่อในการทำงานของตัวกำหนดตารางเวลาระบบปฏิบัติการดังนั้นฉันจึงใช้notify()
"