Cả Khóa cấp độ đối tượng và Vị trí cấp lớp k được sử dụng để đạt được đồng bộ hóa các cơ chế trong một ứng dụng đa luồng.
Khóa cấp độ đối tượng
Mọi đối tượng trong Java có một khóa duy nhất . Nếu một chuỗi muốn thực thi một phương thức được đồng bộ hóa trên một đối tượng nhất định, đầu tiên nó phải có được một khóa của đối tượng đó. Khi luồng có khóa thì nó được phép thực thi bất kỳ phương thức đồng bộ nào trên đối tượng đó. Sau khi quá trình thực thi phương thức hoàn tất, chuỗi sẽ tự động giải phóng khóa. Việc mua và phát hành khóa nội bộ do JVM đảm nhận . Khóa cấp độ đối tượng là cơ chế khi chúng tôi muốn đồng bộ hóa phương thức không tĩnh hoặc khối mã không tĩnh sao cho chỉ một luồng có thể thực thi khối mã trên một phiên bản nhất định của lớp. Điều này luôn có thể được thực hiện để đảm bảo an toàn cho chuỗi dữ liệu cấp phiên bản.
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(); } }
Đầu ra
t1 t2 t3 Synchronized block t1 Synchronized block t3 Synchronized block t1 end Synchronized block t3 end Synchronized block t2 Synchronized block t2 end
Khóa cấp độ lớp học
Mỗi lớp trong Java có một khóa duy nhất không có gì khác ngoài khóa cấp độ lớp học . Nếu một chuỗi muốn thực thi một phương thức đồng bộ hóa tĩnh thì chuỗi yêu cầu khóa cấp độ lớp . Sau khi một luồng có khóa cấp độ lớp, thì nó được phép thực thi bất kỳ phương thức đồng bộ tĩnh nào của lớp đó. Khi quá trình thực thi phương thức hoàn tất, luồng sẽ tự động giải phóng khóa. Khóa cấp độ lớp học ngăn nhiều chuỗi nhập vào một khối được đồng bộ hóa trong bất kỳ phiên bản nào có sẵn trên thời gian chạy.
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(); } }
Đầu ra
t3 t2 t1 Synchronized block t3 Synchronized block t3 end Synchronized block t2 Synchronized block t2 end Synchronized block t1 Synchronized block t1 end