Câu trả lời này được viết vào năm 2011 theo quan điểm của Sun JDK thời đó chạy trên các hệ điều hành thời đó thực sự đã làm gì. Đó là một thời gian dài trước đây! Câu trả lời của leventov cung cấp một viễn cảnh cập nhật hơn.
Bài đăng đó là sai, và nanoTime
an toàn. Có một bình luận về bài đăng liên kết đến một bài đăng trên blog của David Holmes , một anh chàng thời gian thực và đồng thời tại Sun. Nó nói rằng:
System.nanoTime () được triển khai bằng API QueryPerformanceCorer / QueryPerformanceFrequency [...] Cơ chế mặc định được QPC sử dụng được xác định bởi lớp Trừu tượng phần cứng (HAL) [...] Mặc định này thay đổi không chỉ trên phần cứng mà còn trên cả hệ điều hành phiên bản. Ví dụ: Windows XP Service Pack 2 đã thay đổi mọi thứ để sử dụng bộ hẹn giờ quản lý năng lượng (PMTimer) thay vì bộ đếm thời gian của bộ xử lý (TSC) do các vấn đề với TSC không được đồng bộ hóa trên các bộ xử lý khác nhau trong các hệ thống SMP và do thực tế tần số của nó có thể thay đổi (và do đó mối quan hệ của nó với thời gian trôi qua) dựa trên các cài đặt quản lý năng lượng.
Vì vậy, trên Windows, đây là một vấn đề cho đến WinXP SP2, nhưng bây giờ thì không.
Tôi không thể tìm thấy phần II (hoặc nhiều hơn) nói về các nền tảng khác, nhưng bài viết đó bao gồm một nhận xét mà Linux đã gặp phải và giải quyết vấn đề tương tự theo cách tương tự, với liên kết đến Câu hỏi thường gặp cho clock_gettime (CLOCK_REALTIME) , mà nói:
- Clock_gettime (CLOCK_REALTIME) có nhất quán trên tất cả các bộ xử lý / lõi không? (Có vấn đề vòm không? Ví dụ: ppc, arm, x86, amd64, sparc).
Nó nên hoặc nó được coi là lỗi.
Tuy nhiên, trên x86 / x86_64, có thể thấy các TSC freq không đồng bộ hoặc biến đổi gây ra sự không nhất quán về thời gian. Hạt nhân 2,4 thực sự không có sự bảo vệ chống lại điều này, và hạt nhân 2,6 đầu cũng không làm quá tốt ở đây. Kể từ 2.6,18 trở lên logic để phát hiện điều này là tốt hơn và chúng ta thường sẽ quay trở lại với nguồn đồng hồ an toàn.
ppc luôn có một cơ sở thời gian được đồng bộ hóa, vì vậy đó không phải là một vấn đề.
Vì vậy, nếu liên kết của Holmes có thể được đọc là ngụ ý nanoTime
các cuộc gọi clock_gettime(CLOCK_REALTIME)
đó, thì đó là sự an toàn của kernel 2.6.18 trên x86 và luôn luôn trên PowerPC (vì IBM và Motorola, không giống như Intel, thực sự biết cách thiết kế bộ vi xử lý).
Đáng buồn thay, không có đề cập đến SPARC hay Solaris. Và tất nhiên, chúng tôi không biết IBM JVM làm gì. Nhưng Sun JVM trên Windows và Linux hiện đại đã hiểu điều này.
EDIT: Câu trả lời này dựa trên các nguồn mà nó trích dẫn. Nhưng tôi vẫn lo lắng rằng nó thực sự có thể sai hoàn toàn. Một số thông tin cập nhật hơn sẽ thực sự có giá trị. Tôi vừa bắt gặp một liên kết đến một bài báo mới hơn bốn năm về đồng hồ của Linux có thể hữu ích.