Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Sự khác biệt giữa volatile và transient trong Java

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);
    }
}