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

Khóa cấp đối tượng (Object level lock) vs Khóa cấp lớp (Class level lock) trong Java?

Cả Object level lock và Class level lock đều dùng để đạt được cơ chế đồng bộ hóa trong ứng dụng đa luồng.

Object level lock

Mỗi đối tượng trong Java có một khóa duy nhất. Nếu luồng muốn thực thi phương thức synchronized trên đối tượng đó, trước tiên nó phải lấy khóa của đối tượng. Sau khi lấy khóa, nó được phép thực thi bất kỳ phương thức synchronized nào trên đối tượng đó. Sau khi thực thi xong, luồng tự động giải phóng khóa. Việc lấy và giải phóng khóa nội bộ được JVM quản lý. Object level lock dùng khi muốn đồng bộ hóa phương thức non-static hoặc khối mã non-static sao cho chỉ một luồng thực thi khối mã trên một instance của lớp. Điều này làm an toàn dữ liệu cấp instance.

Ví dụ

public class ObjectLevelLockTest implements Runnable { 
    @Override 
    public void run() { 
        objectLock(); 
    } 
    public void objectLock() { 
        System.out.println(Thread.currentThread().getName()); 
        synchronized(this) { 
            System.out.println("Synchronized block " + Thread.currentThread().getName()); 
            System.out.println("Synchronized block " + Thread.currentThread().getName() + " end"); 
        } 
    } 
    public static void main(String[] args) { 
        ObjectLevelLockTest test1 = new ObjectLevelLockTest(); 
        Thread t1 = new Thread(test1); 
        Thread t2 = new Thread(test1); 
        ObjectLevelLockTest test2 = new ObjectLevelLockTest(); 
        Thread t3 = new Thread(test2); 
        t1.setName("t1"); 
        t2.setName("t2"); 
        t3.setName("t3"); 
        t1.start(); 
        t2.start(); 
        t3.start(); 
    } 
}

Kết quả

t1 t2 t3 Synchronized block t1 Synchronized block t3 Synchronized block t1 end Synchronized block t3 end Synchronized block t2 Synchronized block t2 end

Class level lock

Mỗi lớp trong Java có một khóa duy nhất gọi là class level lock. Nếu luồng muốn thực thi phương thức static synchronized, nó cần class level lock. Khi đã có khóa cấp lớp, luồng được phép thực thi bất kỳ phương thức static synchronized nào của lớp đó. Sau khi thực thi xong, luồng tự động giải phóng khóa. Class level lock ngăn nhiều luồng vào khối synchronized trong tất cả các instance có sẵn tại runtime.

Ví dụ

public class ClassLevelLockTest implements Runnable { 
    @Override 
    public void run() { 
        classLock(); 
    } 
    public void classLock() { 
        System.out.println(Thread.currentThread().getName()); 
        synchronized(ClassLevelLockTest.class) { 
            System.out.println("Synchronized block " + Thread.currentThread().getName()); 
            System.out.println("Synchronized block " + Thread.currentThread().getName() + " end"); 
        } 
    } 
    public static void main(String[] args) { 
        ClassLevelLockTest test1 = new ClassLevelLockTest(); 
        Thread t1 = new Thread(test1); 
        Thread t2 = new Thread(test1); 
        ClassLevelLockTest test2 = new ClassLevelLockTest(); 
        Thread t3 = new Thread(test2); 
        t1.setName("t1"); 
        t2.setName("t2"); 
        t3.setName("t3"); 
        t1.start(); 
        t2.start(); 
        t3.start(); 
    } 
}

Kết quả

t3 t2 t1 Synchronized block t3 Synchronized block t3 end Synchronized block t2 Synchronized block t2 end Synchronized block t1 Synchronized block t1 end