2015-05-06 14 views
6

Tôi đã xem mã nguồn Java cho lớp AtomicInteger (tìm thấy here) để xem nguyên thủy nguyên tử nào được yêu cầu để triển khai JVM. Tôi nhận thấy họ sử dụng API Unsafe không có giấy tờ để thực hiện các hoạt động nguyên tử nguyên tử của họ và chỉ có hai nguyên thủy mà họ sử dụng có vẻ là các hoạt động compare and swapcompare and set. Và lớp Unsafe thực hiện các hướng dẫn này như là các phương thức tự nhiên dẫn tôi tin rằng chúng đang sử dụng các hướng dẫn gốc để thực hiện các phép toán nguyên thủy này trong trường hợp chung. Tuy nhiên, không phải mọi bộ vi xử lý (mặc dù hầu hết các bộ xử lý hiện đại đều có) có một bộ chỉ lệnh hỗ trợ các nguyên thủy này một cách nguyên bản. Bây giờ, ngay cả khi không có bộ xử lý nguyên gốc, những hỗ trợ nguyên thủy này có thể được VM thực hiện theo cách đảm bảo nguyên tử với các luồng VM khác, nhưng không nhất thiết với các luồng gốc khác. Vì vậy, java yêu cầu những nguyên thủy trên kiến ​​trúc bản địa để có một JVM hợp lệ và do đó tất cả các triển khai JVM sẽ hỗ trợ nguyên tử với các chủ đề gốc, hoặc là nguyên tử trong java chỉ đảm bảo giữa các chủ đề java?Do Java Atomics chỉ yêu cầu nguyên tử đối với VM

+2

Tôi sẽ làm điều này là câu trả lời nhưng tôi không thể tìm thấy liên kết nữa. Nhóm thực hiện JVM trên mỗi kiến ​​trúc sẽ xác định mã. Nếu kiến ​​trúc hỗ trợ các lệnh nguyên tử, thì đó là những gì được sử dụng. Nếu không thì mã sẽ mô phỏng các hướng dẫn nguyên tử đó. Nó có thể là CAS hoặc LL/SC hoặc mã mô phỏng. Nếu tôi tìm thấy những liên kết tôi đăng nhiều hơn. – edharned

+0

@edharned tốt nếu sự hỗ trợ cho atomicity với chủ đề bản địa là phụ thuộc vào kiến ​​trúc sau đó nó không được đảm bảo bởi các đặc điểm kỹ thuật JVM sau đó chính xác? Đó là để nói một JVM thực hiện trên một kiến ​​trúc mà không hỗ trợ các hướng dẫn (hoặc khả năng tái tạo hiệu ứng của các hướng dẫn) sẽ vẫn là một JVM hợp lệ. –

+0

Nền tảng nào không có hướng dẫn nguyên tử có JVM được chuyển đến? Tôi không biết bất kỳ – the8472

Trả lời

3

Các JNI không cung cấp bất kỳ cách nào cho một sợi tự nhiên để có được địa chỉ của một biến Java. Tất cả quyền truy cập vào biến, cho dù từ mã Java bytecode hoặc từ một chuỗi gốc, phải đi qua máy móc JVM. Vì vậy, câu hỏi của bạn thực sự là tranh luận.

Nguyên tử Java "yêu cầu atomicity đối với JVM" và "đối với JVM" là chỉ trường hợp quan trọng.

+0

cảm ơn, tôi đoán tôi đã không suy nghĩ về cách bạn sẽ có được một xử lý dữ liệu từ mã nguồn gốc, nhưng cách duy nhất mà không vi phạm JVM là thông qua JNI và JNI sẽ được yêu cầu sửa đổi tất cả các giá trị nguyên tử anyways. –

+0

Về mặt lý thuyết, trong thực tế sử dụng bộ đệm được ánh xạ bộ nhớ + Không an toàn có thể có liên quan, nhưng nếu bạn làm điều đó, bạn đang di chuyển bên ngoài thông số JVM. Mặc dù có thể thay đổi với các thay đổi JMM được lên lịch cho java9 – the8472

+0

@ the8472 ngay tùy thuộc vào triển khai VM bạn đang sử dụng, bạn có thể tìm ra địa chỉ của vùng heap JVM và nhận vị trí thực tế trong bộ nhớ của bất kỳ biến cụ thể nào bạn đã vi phạm đặc tả VM và không có gì trong đặc tả được đảm bảo hoạt động. –

2

Hệ điều hành duy nhất được biết không hỗ trợ CAS hoặc LL/SC là The SPARC 32 and PA-RISC. Theo tài liệu trong số JSR-133 Cookbook (chuyển đến phần Bộ xử lý), độ phân giải cho điều này là xây dựng từ ldcw. Được nêu là

Nguyên tử nguyên tử duy nhất trên pa-risc là ldcw, một dạng thử nghiệm và thiết lập, từ đó bạn cần xây dựng các bản cập nhật điều kiện nguyên tử bằng các kỹ thuật như HP trắng giấy trên spinlocks.

http://h21007.www2.hp.com/portal/download/files/unprot/itanium/spinlocks.pdf

Ngoài ra một số thông tin về futexes

https://parisc.wiki.kernel.org/index.php/FutexImplementation

+0

Ok, đó là một số thông tin thú vị về những triển khai cụ thể đó, nhưng nó không thực sự trả lời câu hỏi của tôi là nó có vi phạm đặc tả JVM để triển khai JVM hay không. là guarenteed để được nguyên tử cho các chủ đề JVM. –

Các vấn đề liên quan