Công cụ sửa đổi thoáng qua và dễ bay hơi là gì?


126

Ai đó có thể giải thích ý nghĩa của các từ transientvolatilesửa đổi trong Java không?


3
Đây rõ ràng không phải là một câu hỏi và dù sao đây cũng là một bản sao (đó là lý do tại sao tôi đã bỏ phiếu để đóng). Xem ví dụ Tại sao Java có các biến tạm thời? Khi nào chính xác bạn sử dụng từ khóa dễ bay hơi trong Java? (và nhiều người khác).
Pascal Thivent


18
Đây là một câu hỏi hoàn toàn hợp lệ, tương đương với: stackoverflow.com/questions/215497/
Kẻ

Câu trả lời:


156

Các sửa đổi volatiletransientcó thể được áp dụng cho các trường của lớp 1 không phân biệt loại trường. Ngoài ra, chúng không liên quan.

Công cụ transientsửa đổi báo cho hệ thống con tuần tự hóa đối tượng Java để loại trừ trường khi tuần tự hóa một thể hiện của lớp. Khi đối tượng được khử lưu huỳnh, trường sẽ được khởi tạo thành giá trị mặc định; tức là nullđối với loại tham chiếu và không hoặc falseđối với loại nguyên thủy. Lưu ý rằng JLS (xem 8.3.1.3 ) không nói transientnghĩa là gì , nhưng lại tuân theo Đặc tả tuần tự hóa đối tượng Java . Các cơ chế tuần tự hóa khác có thể chú ý đến tính chất của một trường transient. Hoặc họ có thể bỏ qua nó.

(Lưu ý rằng JLS cho phép một statictrường được khai báo là transient. Sự kết hợp này không có ý nghĩa đối với Tuần tự hóa đối tượng Java, vì dù sao nó cũng không tuần tự hóa các thống kê. Tuy nhiên, nó có thể có ý nghĩa trong các bối cảnh khác, vì vậy có một số biện minh cho không cấm nó hoàn toàn.)

Công cụ volatilesửa đổi cho JVM ghi vào trường phải luôn luôn được đồng bộ hóa vào bộ nhớ và các lần đọc của trường phải luôn luôn đọc từ bộ nhớ. Điều này có nghĩa là các trường được đánh dấu là không ổn định có thể được truy cập và cập nhật một cách an toàn trong ứng dụng đa luồng mà không cần sử dụng đồng bộ hóa dựa trên thư viện gốc hoặc thư viện chuẩn. Tương tự, đọc và ghi vào các trường dễ bay hơi là nguyên tử. (Điều này không áp dụng cho >> các trường << longhoặc doubletrường không biến động , có thể bị "xé từ" trên một số JVM.) Các phần có liên quan của JLS là 8.3.1.4 , 17.417.7 .


1 - Nhưng không để các biến hoặc tham số cục bộ.


10

volatiletransienttừ khóa

1) transienttừ khóa được sử dụng cùng với các biến thể hiện để loại trừ chúng khỏi quá trình tuần tự hóa. Nếu một trường là transientgiá trị của nó sẽ không được duy trì.

Mặt khác, volatiletừ khóa được sử dụng để đánh dấu một biến Java là "được lưu trữ trong bộ nhớ chính".

Mỗi lần đọc một volatilebiến sẽ được đọc từ bộ nhớ chính của máy tính, chứ không phải từ bộ đệm CPU và mỗi lần ghi vào một volatilebiến sẽ được ghi vào bộ nhớ chính chứ không chỉ vào bộ đệm CPU.

2) transienttừ khóa không thể được sử dụng cùng với statictừ khóa nhưng volatilecó thể được sử dụng cùng với static.

3) transientcác biến được khởi tạo với giá trị mặc định trong quá trình khử tuần tự và việc gán hoặc khôi phục giá trị phải được xử lý bằng mã ứng dụng.

Để biết thêm thông tin, hãy xem blog của tôi:
http://javaexplorer03.blogspot.in/2015/07/difference-b between-voliverse-and.html


2
Lý do transientbiến không thể được sử dụng cùng với statictừ khóa là biến tĩnh thuộc về một lớp chứ không phải cho bất kỳ trường hợp riêng lẻ nào. Khái niệm tuần tự hóa liên quan đến trạng thái hiện tại của đối tượng. Chỉ dữ liệu được liên kết với một thể hiện cụ thể của một lớp được tuần tự hóa, do đó các trường thành viên tĩnh bị bỏ qua trong quá trình tuần tự hóa
Chaklader Asfak Arefe

Trên thực tế, JLS cho phép statictransientđược sử dụng cùng nhau. Vấn đề là nó rất ít có ý nghĩa, bởi vì các cơ chế tuần tự hóa điển hình không tồn tại thống kê.
Stephen C

7

Dễ bay hơi có nghĩa là các chủ đề khác có thể chỉnh sửa biến cụ thể đó. Vì vậy, trình biên dịch cho phép truy cập vào chúng.

http://www.javamex.com/tutorials/synyncization_voliverse.shtml

Transient có nghĩa là khi bạn tuần tự hóa một đối tượng, nó sẽ trả về giá trị mặc định của nó khi khử tuần tự hóa

http://www.geekinterview.com/question_details/2


5
"Vì vậy, trình biên dịch cho phép truy cập vào chúng." Câu của bạn cho thấy các chủ đề không có quyền truy cập theo mặc định. Bây giờ tôi đọc liên kết và câu trả lời khác tôi hiểu: trình biên dịch không thực hiện bất kỳ loại lưu trữ trung gian cụ thể theo luồng nào của biến để các luồng khác có thể thấy các thay đổi được inmediatly.
helios

Tôi đã sử dụng C của biến động và java sử dụng nhầm lẫn dễ bay hơi. Tôi có nghĩa là trình biên dịch đảm bảo nó có quyền truy cập vào giá trị Actaul của trường chứ không phải là một giá trị được lưu trữ.
Raynos

nó có nghĩa hơn thế
Stephen C

1

Tạm thời :

Trước tiên cần biết nó cần ở đâu để thu hẹp khoảng cách.

1) Một bộ điều chỉnh truy cập tạm thời chỉ áp dụng cho thành phần biến. Nó sẽ không được sử dụng với phương thức hoặc lớp.

2) Từ khóa thoáng qua không thể được sử dụng cùng với từ khóa tĩnh.

3) serialization là gì và nó được sử dụng ở đâu? Tuần tự hóa là quá trình làm cho trạng thái của đối tượng liên tục. Điều đó có nghĩa là trạng thái của đối tượng được chuyển đổi thành một luồng byte được sử dụng để duy trì (ví dụ: lưu trữ byte trong tệp) hoặc truyền (ví dụ gửi byte qua mạng). Theo cùng một cách, chúng ta có thể sử dụng quá trình khử lưu huỳnh để đưa trạng thái của đối tượng trở lại từ byte. Đây là một trong những khái niệm quan trọng trong lập trình Java vì tuần tự hóa chủ yếu được sử dụng trong lập trình mạng. Các đối tượng cần truyền qua mạng phải được chuyển đổi thành byte. Trước khi hiểu từ khóa thoáng qua, người ta phải hiểu khái niệm tuần tự hóa. Nếu người đọc biết về tuần tự hóa, xin vui lòng bỏ qua điểm đầu tiên.

Lưu ý 1) Transient chủ yếu được sử dụng cho quá trình serialzation. Vì vậy, lớp phải thực hiện giao diện java.io.Serializable. Tất cả các trường trong lớp phải được tuần tự hóa. Nếu một trường không được tuần tự hóa, nó phải được đánh dấu thoáng qua.

Lưu ý 2) Khi diễn ra quá trình khử lưu huỳnh, chúng được đặt thành giá trị mặc định - zero, false hoặc null theo ràng buộc kiểu.

Lưu ý 3) Từ khóa thoáng qua và mục đích của nó? Một trường được khai báo với công cụ sửa đổi thoáng qua, nó sẽ không tham gia vào quá trình tuần tự hóa. Khi một đối tượng được tuần tự hóa (được lưu trong bất kỳ trạng thái nào), các giá trị của các trường tạm thời của nó bị bỏ qua trong biểu diễn nối tiếp, trong khi trường không phải là các trường tạm thời sẽ tham gia vào quá trình tuần tự hóa. Đó là mục đích chính của từ khóa thoáng qua.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.