Trong môi trường đa luồng (multithreading), hai hoặc nhiều luồng có thể truy cập tài nguyên chia sẻ cùng lúc dẫn đến hành vi không nhất quán của hệ thống. Java dùng khái niệm locks (khóa) để hạn chế truy cập đồng thời vào tài nguyên/đối tượng chia sẻ. Locks có thể áp dụng ở hai cấp độ:
- Object Level Locks: Dùng khi muốn phương thức non-static hoặc block code non-static chỉ được truy cập bởi một luồng.
- Class Level Locks: Dùng khi muốn ngăn nhiều luồng vào synchronized block trong tất cả instance có sẵn tại runtime. Luôn dùng để làm cho dữ liệu static thread-safe.
| STT | Tiêu chí | Object Level Lock | Class Level Lock |
|---|---|---|---|
| 1 | Cơ bản | Dùng khi muốn non-static method/block chỉ truy cập bởi 1 thread | Dùng khi muốn ngăn multiple threads vào synchronized block trong tất cả instance runtime |
| 2 | Static/Non-Static | Luôn dùng để làm non-static data thread-safe | Luôn dùng để làm static data thread-safe |
| 3 | Số lượng Lock | Mỗi object của class có lock riêng | Nhiều object của class tồn tại nhưng chỉ có 1 class object lock |
Ví dụ Class Level Lock
public class ClassLevelLockExample {
public void classLevelLockMethod() {
synchronized (ClassLevelLockExample.class) {
// DO your stuff here
}
}
}
Ví dụ Object Level Lock
public class ObjectLevelLockExample {
public void objectLevelLockMethod() {
synchronized (this) {
// DO your stuff here
}
}
}