Ai đó có thể giải thích ý nghĩa của các từ transient
và volatile
sửa đổi trong Java không?
Ai đó có thể giải thích ý nghĩa của các từ transient
và volatile
sửa đổi trong Java không?
Câu trả lời:
Các sửa đổi volatile
và transient
có 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ụ transient
sử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 transient
nghĩ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 static
trườ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ụ volatile
sử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 << long
hoặc double
trườ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.4 và 17.7 .
1 - Nhưng không để các biến hoặc tham số cục bộ.
volatile
và transient
từ khóa
1) transient
từ 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à transient
giá trị của nó sẽ không được duy trì.
Mặt khác, volatile
từ 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 volatile
biế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 volatile
biến sẽ được ghi vào bộ nhớ chính chứ không chỉ vào bộ đệm CPU.
2) transient
từ khóa không thể được sử dụng cùng với static
từ khóa nhưng volatile
có thể được sử dụng cùng với static
.
3) transient
cá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
transient
biến không thể được sử dụng cùng với static
từ 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
static
và transient
đượ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ê.
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
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.