Locks ใน Multithreading
Java ใช้ locks จำกัดการเข้าถึง shared resources แบบ concurrent มี 2 ระดับ:
Object Level Lock
- ใช้เมื่อต้องการ non-static method/block เข้าถึงได้เพียง thread เดียว
- แต่ละ object instance มี lock ของตัวเอง
- ทำให้ non-static data thread-safe
Class Level Lock
- ใช้เมื่อต้องการป้องกัน multiple threads เข้า synchronized block ในทุก instances
- ใช้สำหรับ static data thread-safety
- ทุก instances แชร์ lock เดียวกัน (class object lock)
ตารางเปรียบเทียบ
| Key | Object Level Lock | Class Level Lock |
|---|---|---|
| Basic | Non-static method/block accessed by one thread | Prevent multiple threads entering synchronized block in any instance |
| Static/Non-Static | Non-static data thread safety | Static data thread safety |
| Number of Locks | แต่ละ object มี lock ของตัวเอง | หลาย objects แชร์ class lock เดียว |
ตัวอย่าง Class Level Lock
public class ClassLevelLockExample {
public void classLevelLockMethod() {
synchronized (ClassLevelLockExample.class) {
// DO your stuff here
}
}
}
ตัวอย่าง Object Level Lock
public class ObjectLevelLockExample {
public void objectLevelLockMethod() {
synchronized (this) {
// DO your stuff here
}
}
}
สรุป
synchronized(this)= Object level locksynchronized(MyClass.class)= Class level lock- เลือกตาม scope ของ data ที่ต้องการป้องกัน (instance vs static)