Là những câu hỏi phỏng vấn nâng cao / không công bằng liên quan đến đồng thời Java? [đóng cửa]


12

Dưới đây là một số câu hỏi gần đây tôi đã hỏi những người được phỏng vấn nói rằng họ biết đồng thời Java:

  1. Giải thích mối nguy của "khả năng hiển thị bộ nhớ" - cách JVM có thể sắp xếp lại các hoạt động nhất định trên các biến không được bảo vệ bởi màn hình và không được khai báo volatile, sao cho một luồng có thể không nhìn thấy các thay đổi được thực hiện bởi luồng khác. Thông thường tôi hỏi cái này bằng cách hiển thị mã nơi có mối nguy hiểm này (ví NoVisibilitydụ như trong Liệt kê 3.1 từ "Đồng thời Java trong thực tiễn" của Goetz et al) và hỏi điều gì sai.
  2. Giải thích làm thế nào volatileảnh hưởng đến không chỉ biến thực tế được khai báo volatile, mà còn bất kỳ thay đổi nào đối với các biến được tạo bởi một luồng trước khi nó thay đổi volatilebiến.
  3. Tại sao bạn có thể sử dụng volatilethay vì synchronized?
  4. Thực hiện một biến điều kiện với wait()notifyAll(). Giải thích tại sao bạn nên sử dụng notifyAll(). Giải thích tại sao biến điều kiện nên được kiểm tra bằng một whilevòng lặp.

Câu hỏi của tôi là - những điều này phù hợp hay quá tiên tiến để hỏi ai đó nói rằng họ biết đồng thời Java?

Và trong khi chúng ta đang ở đó, bạn có nghĩ rằng ai đó làm việc trong đồng thời Java sẽ được mong đợi có kiến ​​thức trên mức trung bình về bộ sưu tập rác Java không?


4
Suy nghĩ duy nhất tôi lo lắng là tránh đi sâu vào "sự kiện ghi nhớ" thay vì "kỹ năng".
tylerl

5
Những câu hỏi này có vẻ hoàn toàn hợp lý cho bất kỳ ai được thuê vào một vị trí java sẽ đòi hỏi mức độ đồng thời cao.
Giàn khoan

2
Nếu bạn đang tuyển dụng cho một vị trí cần phát triển đồng thời, đây chỉ là khởi đầu. Nhưng tôi tự hỏi bạn sẽ phản ứng thế nào nếu ai đó trả lời câu hỏi của bạn về notifyAll()"Tôi không tin vào việc thực hiện công việc của bộ lập lịch hệ điều hành, vì vậy tôi sử dụng notify()"
kdgregory

2
Tôi cũng sẽ thêm Q về khóa juc, cấu trúc dữ liệu, nhóm luồng và không an toàn :-)
Martijn Verburg

2
Những người khác đã nói về sự phức tạp của các câu hỏi. Giả sử chúng có liên quan đến dự án, hãy đảm bảo dẫn đến họ bằng một số câu hỏi đơn giản hơn và từ bỏ câu hỏi này nếu nó trở nên rõ ràng, ứng viên vượt ra khỏi chiều sâu của họ - đó là sự lãng phí thời gian của họ và làm hỏng năng lượng của bạn của cuộc phỏng vấn. Không có điểm nào trong việc đặt câu hỏi mà bạn biết họ sẽ không thể trả lời. Hãy chắc chắn rằng bạn đã sẵn sàng đi sâu vào các chủ đề khác - chỉ vì ai đó yếu ở đây không có nghĩa là họ không đủ năng lực và có thể chứng tỏ bản thân thông qua các thế mạnh khác.
Sean McS Something 21/213

Câu trả lời:


11

Nó thực sự phụ thuộc vào việc bạn đang hỏi một ứng viên có 2 năm kinh nghiệm Java hay một người có 7 năm kinh nghiệm Java. Đối với một kiến ​​trúc sư / lãnh đạo kỹ thuật / cấp cao, họ có vẻ là những câu hỏi thích hợp nhưng đối với một thiếu niên và có thể là một người trung cấp cũng vậy, họ có vẻ khó khăn.

Ngoài ra, bạn đang đặt câu hỏi về các cơ chế đồng bộ hóa mức thấp đã được thay thế chủ yếu bằng java.util.concurrentphát triển Java ngày nay; thay vì wait()/notify() khóa được ưa thích. Bạn có thể thấy rằng phiên bản Java 2 hiệu quả đã bỏ một chương giải thích chi tiết về cơ chế chờ / thông báo, vì nó không được coi là hữu ích. Ngoài ra, container xử lý đa luồng ở mức cao hơn trong hầu hết các trường hợp; các phương thức của EJB là ví dụ an toàn luồng mà không có bất kỳ mối quan tâm nào từ người lập trình (điều này không có nghĩa là các lập trình viên không nên biết đa luồng).

Tôi thực sự thấy đa luồng là một phần con của các hệ điều hành chứ không phải là một phần con của ngôn ngữ lập trình. Để xem liệu một người có thực sự hiểu các câu hỏi lập trình đa luồng và song song về mutexes, semaphores hoặc lên lịch nên được hỏi trước tiên và chỉ sau đó, chi tiết về việc thực hiện trong một ngôn ngữ lập trình cụ thể.


2
+1 trên các bình luận chờ () và thông báo () - tuy nhiên, một nhà phát triển thành thạo đồng thời sẽ biết lịch sử và sự phát triển của các khả năng của Java trong không gian này (bao gồm cả cách tiếp cận F & J trong Java 7).
Martijn Verburg

@ M3th: Người cuối cùng tôi hỏi những câu hỏi này có 10 năm kinh nghiệm Java và tuyên bố sẽ biết lập trình đồng thời. Cảm ơn bạn đã đăng lockso với wait/notify- Tôi biết về lockcuốn sách Goetz nhưng không nhận ra rằng nó hiện được ưa thích hơn so với cách cũ. Tôi đồng ý với @Martijn mặc dù ai đó có trình độ kinh nghiệm này nên biết về các phương pháp cũ hơn. Dù sao tôi không có ý hỏi lại câu hỏi (đặc biệt là vì tôi đã đánh dấu nó là câu trả lời - bởi bạn :-)) nhưng tôi nghĩ ai đó có 10 năm kinh nghiệm sẽ có thể trả lời những câu hỏi đó, phải không?
sparc_s Lan

1
@Martijn Verburg Tôi đồng ý với cả hai bạn; một nhà phát triển Java giỏi (đặc biệt là một nhà phát triển nói rằng họ biết đồng thời) nên biết cách sử dụng Wait () / notify (); ít nhất là vì sự tò mò về lý do tại sao chúng xuất hiện trong lớp Object.
m3th0dman

1
@sparc_s Lan Một lập trình viên tuyên bố rõ ràng trong sơ yếu lý lịch của mình rằng anh ấy / cô ấy biết đồng thời Java nên biết các câu trả lời (ít nhất là 3 câu cuối). Về mức độ kinh nghiệm, như tôi đã nói, tôi là một lập trình viên tuyên bố / mong muốn trở thành kiến ​​trúc sư / lãnh đạo kỹ thuật \ nhà phát triển cao cấp và có hơn 5 kinh nghiệm Java (phụ trợ, không phải là JSP và MVC Framework) nên biết câu trả lời. Về lockvs wait/notify, khóa được ưa thích khi bạn thực sự cần các tính năng cấp thấp nhưng trong hầu hết các trường hợp, có sẵn một sự thay thế cấp cao hơn; BlockingQueue là một đặc biệt hữu ích.
m3th0dman

14

Đây có phải là thích hợp hoặc quá tiên tiến để hỏi ai đó nói rằng họ biết đồng thời Java?

Tôi muốn nói rằng chúng là những câu hỏi tương đối nâng cao. Tuy nhiên, họ không "không công bằng" theo nghĩa là họ không lừa câu hỏi.

Quả thực "sự công bằng" không thực sự là một tiêu chí có liên quan. Điều bạn (với tư cách là một người phỏng vấn) nên lo lắng là liệu các câu hỏi và cách giải thích câu trả lời của bạn có đang chọn ứng viên tốt nhất cho vị trí hoặc vị trí bạn đang phỏng vấn hay không. (Hoặc nói cách khác, bạn có đang từ chối các ứng viên mà bạn thực sự nên cân nhắc nhiều hơn do họ không trả lời chính xác những câu hỏi này không?)

Và trong khi chúng ta đang ở đó, bạn có nghĩ rằng ai đó làm việc trong đồng thời Java sẽ được mong đợi có kiến ​​thức trên mức trung bình về bộ sưu tập rác Java không?

Một lần nữa, đó không thực sự là câu hỏi liên quan. Câu hỏi bạn nên tự đặt ra là liệu bạn có cần một người có kiến ​​thức tốt về bộ sưu tập rác Java hay không.


Cảm ơn rất nhiều vì phản ứng này. Tôi thực sự ước tôi có thể đánh dấu cả hai là câu trả lời. Tôi đánh giá cao thời gian bạn đã giúp đỡ ở đây.
sparc_s Lan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.