Từ khóa volatile được dùng trong môi trường đa luồng nơi hai luồng đọc và ghi cùng một biến cùng lúc. Từ khóa volatile flush thay đổi trực tiếp vào main memory thay vì CPU cache.
Ngược lại, từ khóa transient được dùng trong serialization. Các trường được đánh dấu transient không thể là một phần của serialization và deserialization. Chúng ta không muốn lưu giá trị của bất kỳ biến nào thì dùng từ khóa transient với biến đó.
| STT | Tiêu chí | Volatile | Transient |
|---|---|---|---|
| 1 | Cơ bản | Volatile dùng để flush thay đổi trực tiếp vào main memory. | Transient dùng để loại trừ biến khi serialization. |
| 2 | Giá trị mặc định | Volatile không được khởi tạo với giá trị mặc định. | Khi deserialization, transient variables được khởi tạo với giá trị mặc định. |
| 3 | Static | Volatile có thể dùng với biến static. | Transient không thể dùng với từ khóa static. |
| 4 | Final | Volatile có thể dùng với từ khóa final. | Transient không thể dùng với từ khóa final. |
Ví dụ Transient
// Lớp mẫu dùng transient để bỏ qua serialization
class TransientExample implements Serializable {
transient int age;
// serialize các trường khác
private String name;
private String address;
// code khác
}
Ví dụ Volatile
class VolatileExample extends Thread {
boolean volatile isRunning = true;
public void run() {
long count = 0;
while (isRunning) {
count++;
}
System.out.println("Thread terminated. " + count);
}
public static void main(String[] args) throws InterruptedException {
VolatileExample t = new VolatileExample();
t.start();
Thread.sleep(2000);
t.isRunning = false;
t.join();
System.out.println("isRunning set to " + t.isRunning);
}
}