คำถามสัมภาษณ์ขั้นสูง / ไม่เป็นธรรมเหล่านี้เกี่ยวกับ Java concurrency หรือไม่ [ปิด]


12

ต่อไปนี้เป็นคำถามที่ฉันถามผู้สัมภาษณ์เมื่อเร็ว ๆ นี้ว่าพวกเขารู้จักการทำงานพร้อมกันของ Java:

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

คำถามของฉันคือ - สิ่งเหล่านี้เหมาะสมหรือสูงเกินไปที่จะถามคนที่บอกว่าพวกเขารู้จักการทำงานพร้อมกันของ Java หรือไม่

และในขณะที่เราอยู่ที่นี่คุณคิดว่าคนที่ทำงานใน Java เห็นพ้องด้วยควรคาดว่าจะมีความรู้สูงกว่าค่าเฉลี่ยของการเก็บขยะ Java?


4
สิ่งเดียวที่ฉันคิดว่าฉันกังวลคือหลีกเลี่ยงการเข้าไปในวัชพืชของ "ข้อเท็จจริงที่ถูกจดจำ" มากกว่า "ทักษะ"
tylerl

5
คำถามเหล่านี้ดูเหมือนจะเหมาะสมอย่างยิ่งสำหรับผู้ที่ถูกจ้างให้เข้าสู่ตำแหน่งจาวาซึ่งจะต้องมีการทำงานพร้อมกันในระดับสูง
Rig

2
หากคุณกำลังจ้างตำแหน่งที่ต้องการการพัฒนาพร้อมกันสิ่งเหล่านี้เป็นเพียงการเริ่มต้นเท่านั้น แต่ฉันสงสัยว่าคุณจะตอบสนองอย่างไรถ้ามีคนตอบคำถามของคุณเกี่ยวnotifyAll()กับ "ฉันไม่เชื่อในการทำงานของตัวกำหนดตารางเวลาระบบปฏิบัติการดังนั้นฉันจึงใช้notify()"
kdgregory

2
ฉันยังจะเพิ่ม Q เกี่ยวกับ juc Locks โครงสร้างข้อมูล Thread Pools และ Unsafe :-)
Martijn Verburg

2
คนอื่นพูดเกี่ยวกับความซับซ้อนของคำถาม สมมติว่าพวกเขามีความเกี่ยวข้องกับโครงการตรวจสอบให้แน่ใจว่าได้นำพวกเขาไปด้วยคำถามที่ง่ายกว่า & ละทิ้งการตั้งคำถามหากเห็นได้ชัดว่าผู้สมัครนั้นอยู่ในความลึก - เสียเวลาและของคุณและทำลายพลังงาน ของการสัมภาษณ์ ไม่มีจุดในการถามคำถามที่คุณรู้ว่าพวกเขาจะไม่สามารถตอบได้ ตรวจสอบให้แน่ใจว่าได้เตรียมที่จะเจาะลึกในหัวข้ออื่น ๆ ที่คล้ายกัน - เพียงเพราะบางคนอ่อนแอที่นี่ไม่ได้หมายความว่าพวกเขาไม่เก่งและสามารถพิสูจน์ตนเองผ่านจุดแข็งอื่น ๆ
Sean McSomething

คำตอบ:


11

มันขึ้นอยู่กับว่าคุณกำลังขอผู้สมัครที่มีประสบการณ์เกี่ยวกับ Java 2 ปีหรืออย่างใดอย่างหนึ่งกับประสบการณ์ของ Java 7 ปี สำหรับสถาปนิก / นักวิชาการด้านเทคนิค / อาวุโสพวกเขาดูเหมือนคำถามที่เหมาะสม แต่สำหรับรุ่นน้องและอาจอยู่ในระดับกลางเกินไปพวกเขาดูเหมือนจะยาก

นอกจากนี้คุณกำลังถามคำถามเกี่ยวกับกลไกการซิงโครไนซ์ระดับต่ำซึ่งส่วนใหญ่ถูกแทนที่ด้วยjava.util.concurrentในการพัฒนา Java วันปัจจุบัน แทนการwait()/notify() ล็อคเป็นที่ต้องการ คุณจะเห็นว่าEffective Java 2nd editionได้ทิ้งบทที่อธิบายกลไกการรอ / แจ้งอย่างละเอียดเนื่องจากไม่ถือว่ามีประโยชน์ นอกจากนี้คอนเทนเนอร์จัดการมัลติเธรดในระดับที่สูงขึ้นในกรณีส่วนใหญ่ เมธอดของ EJB นั้นปลอดภัยสำหรับเธรดเช่นโดยไม่ต้องกังวลจากโปรแกรมเมอร์ (นี่ไม่ได้หมายความว่าโปรแกรมเมอร์ไม่ควรรู้ว่ามีหลายเธรด)

ฉันเห็นจริง ๆ ว่าการมัลติเธรดเป็นส่วนย่อยของระบบปฏิบัติการมากกว่าส่วนย่อยของภาษาการเขียนโปรแกรม เพื่อที่จะดูว่าบุคคลที่เข้าใจคำถามมัลติเธรดและการเขียนโปรแกรมแบบขนานอย่างแท้จริงเกี่ยวกับ mutexes ควรมีการถามเซมาฟอร์หรือการกำหนดเวลาในตอนแรกและในที่สุดเท่านั้นรายละเอียดเกี่ยวกับการใช้งานในภาษาโปรแกรมเฉพาะ


2
+1 ในการรอความเห็น () และแจ้งเตือน () - อย่างไรก็ตามนักพัฒนาที่เชี่ยวชาญในการทำงานพร้อมกันจะได้รู้ประวัติศาสตร์และวิวัฒนาการของความสามารถของ Java ในพื้นที่นี้ (รวมไปจนถึง F&J ใน Java 7)
Martijn Verburg

@ M3th: คนสุดท้ายที่ฉันถามคำถามเหล่านี้มีประสบการณ์ 10 ปีของ Java และอ้างว่ารู้โปรแกรมพร้อมกัน ขอบคุณสำหรับการโพสต์lockvs. wait/notify- ฉันรู้เกี่ยวกับlockหนังสือ Goetz แต่ไม่ทราบว่าตอนนี้เป็นที่นิยมมากกว่าวิธีเก่า ฉันเห็นด้วยกับ @Martijn แม้ว่าคนที่มีประสบการณ์ในระดับนี้ควรตระหนักถึงวิธีการที่เก่ากว่า อย่างไรก็ตามฉันไม่ได้ตั้งใจถามคำถามอีกครั้ง (โดยเฉพาะเมื่อฉันทำเครื่องหมายว่าเป็นคำตอบแล้ว: คุณ :-)) แต่ฉันคิดว่าคนที่มีประสบการณ์ 10 ปีควรจะสามารถตอบคำถามเหล่านั้นได้หรือไม่?
sparc_spread

1
@Martijn Verburg ฉันเห็นด้วยกับคุณทั้งสอง; ผู้พัฒนา Java ที่ดี (โดยเฉพาะที่บอกว่าเขารู้ว่าทำงานพร้อมกัน) ควรรู้วิธีใช้ wait () / แจ้ง (); อย่างน้อยสำหรับความอยากรู้ว่าทำไมพวกเขาปรากฏในคลาสวัตถุ
m3th0dman

1
@sparc_spread โปรแกรมเมอร์ที่ระบุอย่างชัดเจนในประวัติการทำงานของเขา / เธอที่รู้ว่าเขาเห็นพ้องกับ Java ควรรู้คำตอบ (อย่างน้อย 3 ตัวสุดท้าย) เกี่ยวกับระดับประสบการณ์ดังที่ฉันได้กล่าวไว้ imo โปรแกรมเมอร์ที่อ้างว่า / ปรารถนาที่จะเป็นสถาปนิก / นักพัฒนาด้านเทคนิค \ นักพัฒนาอาวุโสและมีประสบการณ์ 5+ Java (แบ็กเอนด์ไม่ใช่ JSP และ MVC Frameworks) ควรรู้คำตอบ เกี่ยวกับlockvs wait/notifyล็อคเป็นที่ต้องการเมื่อคุณต้องการคุณสมบัติระดับต่ำ แต่ในกรณีส่วนใหญ่จะมีตัวเลือกระดับสูงกว่าให้ใช้งาน BlockingQueue เป็นประโยชน์อย่างยิ่ง
m3th0dman

14

มีความเหมาะสมหรือสูงเกินไปที่จะถามคนที่บอกว่ารู้จักการทำงานพร้อมกันของ Java

ฉันว่าพวกเขาเป็นคำถามขั้นสูง อย่างไรก็ตามพวกเขาไม่ได้ "ไม่ยุติธรรม" ในแง่ที่ว่าพวกเขาไม่ใช่คำถามหลอกลวง

แท้จริงแล้ว "ความยุติธรรม" ไม่ใช่เงื่อนไขที่เกี่ยวข้อง สิ่งที่คุณ (ในฐานะผู้สัมภาษณ์) ควรกังวลคือว่าคำถามและการตีความคำตอบของคุณคือการเลือกผู้สมัครที่ดีที่สุดสำหรับตำแหน่งหรือตำแหน่งที่คุณกำลังสัมภาษณ์ (หรือจะนำไปทางอื่นคุณจะปฏิเสธผู้สมัครที่คุณควรจริงๆจะให้พิจารณามากขึ้นเนื่องจากพวกเขาไม่ได้ตอบคำถามเหล่านี้ "ถูกต้อง"?)

และในขณะที่เราอยู่ที่นี่คุณคิดว่าคนที่ทำงานใน Java เห็นพ้องด้วยควรคาดว่าจะมีความรู้สูงกว่าค่าเฉลี่ยของการเก็บขยะ Java?

อีกครั้งนั่นไม่ใช่คำถามที่เกี่ยวข้องจริงๆ คำถามที่คุณควรถามตัวเองคือคุณต้องการคนที่มีความรู้เกี่ยวกับการเก็บขยะ Java หรือไม่


ขอบคุณมากสำหรับคำตอบนี้ ฉันหวังว่าฉันจะได้ทำเครื่องหมายว่าทั้งสองเป็นคำตอบ ฉันขอขอบคุณเวลาที่คุณช่วยที่นี่
sparc_spread
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.