Tóm lược về AbstractQueuedSynchronizer - tại vin777

Gần đây, tôi đã đọc một bài viết tuyệt vời của các chuyên gia về AQS (AbstractQueuedSynchronizer). Trước đây, tôi thường chỉ lướt qua từng phần nhỏ và mỗi lần đều cảm thấy khó hiểu nên bỏ cuộc. Lần sau quay lại thì lại bắt đầu từ đầu. Nhưng hôm qua, tôi đã cố gắng hết sức để hoàn thành việc đọc phần [tải game nổ cwin666 hũ tặng code](/) đầu tiên.

Trước hết, cần biết rằng AQS có những đặc điểm chính như sau:

11234567891011121314

| ``` // Đây là nút đầu tiên, bạn có thể nghĩ đơn giản rằng nó đại diện cho luồng hiện tại đang giữ khóa. private transient volatile Node head;

// Đây là nút cuối cùng trong danh sách chờ, mỗi nút mới sẽ được thêm vào cuối danh sách, tạo thành một danh sách liên kết. private transient volatile Node tail;

// Đây là thuộc tính quan trọng nhất, biểu thị trạng thái của khóa. Giá trị 0 nghĩa là chưa có ai sử dụng khóa, giá trị lớn hơn 0 nghĩa là khóa đang được giữ bởi một hoặc nhiều luồng. private volatile int state;

// Biểu diễn luồng hiện tại đang nắm quyền kiểm soát khóa độc quyền. // Ví dụ quan trọng nhất: Khóa có thể được tái nhập (reentrant), vì vậy mỗi khi gọi reentrantLock.lock(), giá trị này sẽ tăng lên. // if (currentThread == getExclusiveOwnerThread()) {state++} private transient Thread exclusiveOwnerThread; // Kế thừa từ AbstractOwnableSynchronizer