2012-02-27 18 views

Trả lời

5

Có dễ bay hơi trong phương pháp không chặn sử dụng khóa nguyên tử cấp thấp hay không?

Việc triển khai dễ bay hơi khác nhau giữa mỗi bộ xử lý nhưng nó không phải là lưu trữ/lưu trữ trường - nó thường được thực hiện qua hàng rào bộ nhớ nhưng cũng có thể được quản lý bằng giao thức kết hợp bộ nhớ cache.

Tôi chỉ đọc bài đăng đó. Đó là poster thực sự không chính xác trong lời giải thích của ông về Volatile vs Synchronized flow và ai đó đã sửa chữa anh ta như một bình luận. Dễ bay hơi sẽ không giữ khóa, bạn có thể đọc rằng một cửa hàng dễ bay hơi tương tự như bản phát hành đồng bộ và tải dễ bay hơi tương tự như thu được đồng bộ hóa nhưng chỉ liên quan đến khả năng hiển thị bộ nhớ và không thực hiện chi tiết thực tế

+0

Tôi không đọc nhận xét trong bài đăng đó. Câu trả lời sai lầm tốt nhất đó phải được chỉnh sửa ở đó. :) Bài học kinh nghiệm: không dùng StackOverflow làm từ cuối cùng. – chrisapotek

+0

@chrisapotek Yea, đôi khi nó không may OP là người duy nhất có thể trả lời câu hỏi đúng hoặc không chính xác. –

+0

Áp lực công khai khiến anh chàng chuyển sang câu trả lời tốt hơn. Điều đó nói rằng, luôn luôn là một ý tưởng tốt để có câu trả lời SO trong bối cảnh thích hợp. Cảm ơn john, @chrisapotek. Có thể muốn chỉnh sửa câu hỏi của bạn để chỉ ra điều đó. – Gray

3

Đúng là volatile không gây ra sự chặn.

Tuy nhiên, báo cáo kết quả

một biến không ổn định là tốt hơn so với từ khóa synchronized vì nó không liên quan đến CHẶN hoặc bối cảnh chuyển đổi.

rất đáng tranh cãi và phụ thuộc rất nhiều vào những gì bạn đang cố gắng làm. volatile không tương đương với khóa và tuyên bố biến dễ bay hơi không đưa ra bất kỳ đảm bảo nào liên quan đến tính nguyên tử của các phép toán trong đó biến đó có liên quan, ví dụ: tăng.

Điều gì volatile làm là ngăn trình biên dịch và/hoặc CPU thực hiện lệnh sắp xếp lại hoặc bộ nhớ đệm của biến cụ thể. Điều này được gọi là hàng rào bộ nhớ. Cơ chế nhỏ khó chịu này là cần thiết để đảm bảo rằng trong một môi trường đa luồng, tất cả các luồng đọc một biến cụ thể đều có một cái nhìn cập nhật về giá trị của nó. Điều này được gọi là hiển thị và khác với nguyên tử.

Nguyên tử chỉ có thể được đảm bảo trong trường hợp chung bằng cách sử dụng ổ khóa (synchronized) hoặc nguyên thủy nguyên tử. Tuy nhiên, những gì có thể gây nhầm lẫn là việc sử dụng các cơ chế đồng bộ cũng tạo ra một hàng rào bộ nhớ ngầm, vì vậy khai báo một biến dễ bay hơi nếu bạn chỉ đọc/ghi nó bên trong khối synchronized là không cần thiết.

5

Biến động thực hiện trong một cách tiếp cận không chặn bằng cách sử dụng các khóa nguyên tử mức thấp hoặc không?

Sử dụng volatile tạo hàng rào bộ nhớ xung quanh trường được đề cập. Điều này không làm cho một chuỗi được đưa vào trạng thái "CHẶN". Tuy nhiên khi trường volatile được truy cập, chương trình phải tuôn ra các thay đổi đối với bộ nhớ trung tâm và cập nhật bộ nhớ cache có chu kỳ.Nó có thể dẫn đến chuyển đổi ngữ cảnh nhưng không cần thiết gây ra một.

1

Volatile là công cụ sửa đổi ngôn ngữ java và cách nó cung cấp bảo lãnh của nó đi xuống thực hiện JVM. Đặt nó đơn giản nếu bạn thiết lập một trường nguyên thủy là volatile bạn đảm bảo bất kỳ chủ đề nào đọc trường này, nó sẽ đọc giá trị gần đây nhất. Về cơ bản nó cấm bất kỳ JVM nào đằng sau cảnh tối ưu hóa và buộc tất cả các luồng vượt qua rào cản bộ nhớ để đọc nguyên thủy dễ bay hơi.

+0

Tôi hỏi về chi tiết triển khai, những gì diễn ra sau cảnh, trong triển khai mặc định JVM. Những gì tôi đã biết. :) – chrisapotek

+0

JVM đi kèm với một đặc điểm kỹ thuật và có rất nhiều triển khai thực hiện: http://en.wikipedia.org/wiki/List_of_Java_virtual_machines. Bạn có thể có nghĩa là. nhìn vào mã C của Hotspot JVM nhưng bạn có thực sự muốn làm điều đó không? Không phải là đảm bảo đủ cho bạn? Tương tự như vậy với bất kỳ phương thức native nào trong thư viện jdk, tôi chưa bao giờ xem mã c trên Hotspot JVM đã cài đặt của mình nhưng tôi biết nó có thể làm gì/không thể làm cho tôi, phần lớn thời gian được ghi lại rất tốt. – dimitrisli

0

BLOCKING có nghĩa là các chủ đề không chờ đợi nhau khi đọc cùng một biến số volatile làm điều đó mà không loại trừ lẫn nhau. Tuy nhiên, họ kích hoạt việc đặt hàng rào ở cấp phần cứng để quan sát các ngữ nghĩa "xảy ra trước" (không có sắp xếp lại bộ nhớ).

Để làm cho điều này rõ ràng hơn, biến volatile không bị chặn bởi vì bất cứ khi nào nó được đọc/bởi nhiều luồng đồng thời, lõi CPU gắn với chủ đề của chúng giao tiếp trực tiếp với bộ nhớ chính hoặc thông qua bộ nhớ CPU-coherency (phụ thuộc vào phần cứng/JVM thực hiện) và không có cơ chế khóa được đưa ra.

CONTEXT-SWITCHING Từ khóa dễ bay hơi không kích hoạt ngữ cảnh chuyển đổi từ ngữ nghĩa của nó, nhưng có thể và phụ thuộc vào triển khai cấp thấp hơn.

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