Là một lập trình viên C++ trở nên quen thuộc hơn với Java, có một chút kỳ quặc đối với tôi khi thấy hỗ trợ mức ngôn ngữ để khóa các đối tượng tùy ý mà không có bất kỳ kiểu khai báo nào mà đối tượng hỗ trợ khóa như vậy. Tạo mutexes cho mọi đối tượng có vẻ giống như một chi phí nặng được tự động chọn tham gia. Bên cạnh việc sử dụng bộ nhớ, mutexes là một tài nguyên giới hạn OS trên một số nền tảng. Bạn có thể quay khóa nếu không có sẵn mutex nhưng đặc tính hiệu suất của nó khác nhau đáng kể, điều mà tôi mong đợi sẽ làm tổn thương khả năng dự đoán.JVM có tạo ra một mutex cho mọi đối tượng để thực hiện từ khóa 'đồng bộ' không? Nếu không, làm thế nào?
JVM có đủ thông minh trong mọi trường hợp để nhận ra rằng một đối tượng cụ thể sẽ không bao giờ là đích của từ khóa được đồng bộ hóa và do đó tránh tạo ra mutex không? Các mutex có thể được tạo ra một cách lười biếng, nhưng điều đó đặt ra một vấn đề khởi động mà chính nó đòi hỏi một mutex, và thậm chí nếu nó đã được làm việc xung quanh tôi giả sử vẫn sẽ có một số chi phí để theo dõi liệu một mutex đã được tạo ra hay chưa. Vì vậy, tôi giả định nếu như một tối ưu hóa là có thể, nó phải được thực hiện tại thời gian biên dịch hoặc khởi động. Trong C++, việc tối ưu hóa như vậy sẽ không thể thực hiện được do mô hình biên dịch (bạn không thể biết liệu khóa cho một đối tượng có được sử dụng trên các biên giới thư viện) hay không, nhưng tôi không biết đủ về biên dịch Java và liên kết để biết nếu áp dụng cùng một giới hạn.
Tôi chắc chắn 'đồng bộ' được xử lý nội bộ trong JVM, thay vì dựa vào tài nguyên ở cấp hệ điều hành. –
Điều đó hoàn toàn không đúng. Tôi đồng ý rằng nó có thể được thực hiện theo bất kỳ cách nào mà JVM muốn, nhưng JVM nhất thiết phải dựa vào liên lạc ở cấp độ hệ điều hành ở đâu đó trong nội bộ. Bạn có thể viết lớp mutex của riêng bạn mà quay khóa, nhưng nếu bạn muốn trình lên lịch cho hệ điều hành đặt các chủ đề vào chế độ ngủ và đánh thức chúng một cách thích hợp, tại một số điểm bạn phải nói với hệ điều hành về mutex của bạn và các loại đăng ký đó là giới hạn nguồn. –
Bạn không cần phải nói cho hệ điều hành về mutex của bạn - bạn chỉ cần nói với nó khi các chủ đề nhất định cần được đánh thức. –