Trong ví dụ phương thứcA và phương thứcB là các phương thức cá thể (trái ngược với các phương thức tĩnh). Đưa synchronized
vào một phương thức cá thể có nghĩa là luồng phải thu được khóa ("khóa nội tại") trên đối tượng mà phương thức được gọi trước khi luồng có thể bắt đầu thực thi bất kỳ mã nào trong phương thức đó.
Nếu bạn có hai phương thức cá thể khác nhau được đánh dấu đồng bộ hóa và các luồng khác nhau đang gọi các phương thức đó đồng thời trên cùng một đối tượng, các luồng đó sẽ tranh nhau cho cùng một khóa. Khi một luồng được khóa, tất cả các luồng khác sẽ bị tắt khỏi tất cả các phương thức cá thể được đồng bộ hóa trên đối tượng đó.
Để hai phương thức chạy đồng thời, chúng sẽ phải sử dụng các khóa khác nhau, như thế này:
class A {
private final Object lockA = new Object();
private final Object lockB = new Object();
public void methodA() {
synchronized(lockA) {
//method A
}
}
public void methodB() {
synchronized(lockB) {
//method B
}
}
}
trong đó cú pháp khối được đồng bộ hóa cho phép chỉ định một đối tượng cụ thể mà luồng thực thi cần có khóa nội tại để vào khối.
Điều quan trọng cần hiểu là mặc dù chúng tôi đang đặt một từ khóa "đồng bộ hóa" cho các phương thức riêng lẻ, khái niệm cốt lõi là khóa nội tại đằng sau hậu trường.
Đây là cách hướng dẫn Java mô tả mối quan hệ:
Đồng bộ hóa được xây dựng xung quanh một thực thể nội bộ được gọi là khóa nội tại hoặc khóa màn hình. .
Mỗi đối tượng có một khóa nội tại liên quan đến nó. Theo quy ước, một luồng cần truy cập độc quyền và nhất quán vào các trường của đối tượng phải có được khóa nội tại của đối tượng trước khi truy cập vào chúng, sau đó giải phóng khóa nội tại khi thực hiện với chúng. Một chủ đề được cho là sở hữu khóa nội tại giữa thời gian nó có được khóa và phát hành khóa. Miễn là một luồng sở hữu một khóa nội tại, không có luồng nào khác có thể có được cùng một khóa. Các luồng khác sẽ chặn khi nó cố gắng để có được khóa.
Mục đích của khóa là để bảo vệ dữ liệu chia sẻ. Bạn sẽ sử dụng các khóa riêng biệt như được hiển thị trong mã ví dụ ở trên chỉ khi mỗi khóa bảo vệ các thành viên dữ liệu khác nhau.