Về mặt lý thuyết, có thể đọc được lưu vào bộ nhớ cache. Không có gì trong mô hình bộ nhớ Java ngăn chặn điều đó.
Thực tế, điều đó rất khó xảy ra (trong ví dụ cụ thể của bạn). Câu hỏi đặt ra là, liệu JVM có thể tối ưu hóa qua một cuộc gọi phương thức hay không.
read #1
method();
read #2
Đối với JVM để lý do mà đọC# 2 có thể tái sử dụng các kết quả của đọC# 1 (có thể được lưu trữ trong một thanh ghi CPU), nó phải biết chắc chắn rằng method()
không chứa các hành động đồng bộ hóa. Điều này nói chung là không thể - trừ khi, method()
được gạch chân và JVM có thể nhìn thấy từ mã flatted mà không có đồng bộ/biến động hoặc các hành động đồng bộ hóa khác giữa đọC# 1 và đọC# 2; sau đó nó có thể loại bỏ một cách an toàn đọC# 2.
Bây giờ trong ví dụ của bạn, phương pháp là Thread.sleep()
. Một cách để thực hiện nó là bận vòng lặp cho một số lần, tùy thuộc vào tần số CPU. Sau đó, JVM có thể nội tuyến nó, và sau đó loại bỏ đọC# 2.
Nhưng tất nhiên việc triển khai thực hiện sleep()
là không thực tế. Nó thường được thực hiện như một phương thức native gọi là hạt nhân OS. Câu hỏi đặt ra là, JVM có thể tối ưu hóa trên phương thức gốc như vậy không.
Ngay cả khi JVM có kiến thức về hoạt động bên trong của một số phương pháp gốc, do đó có thể tối ưu hóa trên chúng, không thể xảy ra là sleep()
được xử lý theo cách đó. sleep(1ms)
mất hàng triệu chu kỳ CPU để quay trở lại, thực sự không có điểm tối ưu hóa xung quanh nó để tiết kiệm một vài lần đọc.
-
Thảo luận này cho thấy vấn đề lớn nhất của cuộc đua dữ liệu - phải mất quá nhiều công sức để giải thích. Một chương trình không nhất thiết là sai, nếu nó không được "đồng bộ một cách chính xác", tuy nhiên để chứng minh nó không sai không phải là một nhiệm vụ dễ dàng. Cuộc sống đơn giản hơn nhiều, nếu một chương trình được đồng bộ chính xác và không chứa dữ liệu nào.
Không thể nói 100%, nhưng có vẻ như không đọc đồng bộ của trường không bay hơi không được đảm bảo để đọc giá trị gần đây nhất của 'invoc' (mặc dù ghi * được * đỏ lên do từ khóa 'synchronised' trên phương thức' increment() '.) Không biết mô hình bộ nhớ Java khá tốt, đủ để nói chắc chắn. – dlev
@dlev Đó là, loại, câu hỏi;) – krosenvold
Tôi sắp trả lời, "Nó luôn làm việc cho tôi!". Nhưng cũng tìm thấy http://stackoverflow.com/questions/1006655/are-java-primitive-ints-atomic-by-design-or-by-accident có nội dung "Có" cho ints và "Có thể" trong thời gian dài và tăng gấp đôi . –