Object level lock และ Class level lock ใช้เพื่อให้ได้กลไก synchronization ในแอปพลิเคชัน multi-threaded
Object Level Lock
ทุกออบเจ็กต์ใน Java มี lock เฉพาะตัว หากเธรดต้องการรัน synchronized method บนออบเจ็กต์ใด ต้องได้ lock ของออบเจ็กต์นั้นก่อน หลังรันเสร็จจะ ปล่อย lock อัตโนมัติ JVM ดูแลการ acquire/release ใช้เมื่อต้องการ synchronize non-static method หรือ non-static code block ให้เธรดเดียวเข้าถึงได้ต่ออินสแตนซ์ เพื่อทำให้ instance-level data เป็น thread-safe
ตัวอย่าง
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();
}
}
ผลลัพธ์
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
ทุกคลาสใน Java มี lock เฉพาะตัว เรียกว่า class level lock หากเธรดต้องการรัน static synchronized method ต้องได้ class level lock ก่อน เมื่อได้ lock แล้ว จะรัน static synchronized method ใดๆ ของคลาสนั้น ได้ หลังจบจะปล่อย lock Class level lock ป้องกันไม่ให้หลายเธรดเข้า synchronized block ในทุกอินสแตนซ์ที่มีอยู่
ตัวอย่าง
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();
}
}
ผลลัพธ์
t3 t2 t1 Synchronized block t3 Synchronized block t3 end Synchronized block t2 Synchronized block t2 end Synchronized block t1 Synchronized block t1 end