Java: Phương thức đồng bộ hóa

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Ngôn ngữ lập trình Java cung cấp hai thành ngữ đồng bộ hóa cơ bản: phương thức đồng bộ hóa và khối lệnh đồng bộ hóa. Khối lệnh đồng bộ hóa có tính phức tạp hơn và sẽ được mô tả trong bài viết tiếp theo. Phần này chúng ta sẽ bàn về phương thức đồng bộ hóa.

Để tạo một phương pháp đồng bộ hóa thì ta chỉ cần thêm từ khóa synchronized vào khai báo. Ví dụ:

public class SynchronizedCounter {
    private int c = 0;

    public synchronized void increment() {
        c++;
    }

    public synchronized void decrement() {
        c--;
    }

    public synchronized int value() {
        return c;
    }
}

 

Nếu giả sử counter là một thể hiện của lớp SynchronizedCounter thì những phương thức đồng bộ hóa trên có hai tác dụng:

  • Đầu tiên, nó không cho phép có hai lời gọi phương thức đồng bộ hóa trên cùng một đối tượng dẫn đến hiện tượng xen kẽ. Khi một luồng đang thực hiện một phương thức đồng bộ hóa cho một đối tượng thì luồng khác cũng gọi các phương thức đồng bộ hóa cho khối đối tượng tương tự (đình chỉ thực hiện) cho đến khi luồng đầu tiên được thực hiện với đối tượng.

  • Thứ hai, khi một phương thức đồng bộ thoát, nó sẽ tự động thiết lập một mối quan hệ happens-before với bất kỳ lời gọi tiếp theo nào của một phương thức đồng bộ hóa cho cùng một đối tượng. Điều này đảm bảo rằng những thay đổi trạng thái của đối tượng có thể nhìn thấy ở tất cả các chủ đề.

Lưu ý rằng các hàm tạo không đồng bộ hóa - nếu bạn sử dụng từ khóa synchronized cho hàm tạo thì sẽ phát sinh lỗi. Đồng bộ hóa hàm tạo không có ý nghĩa, bởi vì chỉ có luồng tạo ra một đối tượng mới nên có quyền truy cập đến nó trong khi nó đang được cấu trúc.


Cảnh báo:  Khi xây dựng một đối tượng mà sẽ được chia sẻ giữa các luồng, bạn cần phải rất cẩn thận rằng một tham chiếu đến đối tượng không bị "rò rỉ" sớm. Ví dụ, giả sử bạn muốn duy trì một List được gọi là instances có chứa các thể hiện của lớp. Bạn có thể bị cám dỗ để thêm dòng sau vào hàm tạo của bạn:

instances.add(this);

Nhưng sau đó các luồng khác có thể sử dụng instances để truy cập vào đối tượng trước khi việc xây dựng đối tượng được hoàn tất.

Phương thức đồng bộ hóa cho phép một chiến lược đơn giản để ngăn chặn sự can thiệp luồng và lỗi nhất quán bộ nhớ: nếu một đối tượng là có thể nhìn thấy nhiều hơn một luồng, thì tất cả các thao tác đọc và ghi tới các biến của đối tượng được thực hiện thông qua phương thức synchronized (Một ngoại lệ quan trọng: các trường final không thể được thay đổi sau khi đối tượng được xây dựng, có thể được đọc một cách an toàn thông qua các phương thức không đồng bộ, một khi đối tượng được xây dựng).

» Tiếp: Khóa nội tại và đồng bộ hóa
« Trước: Lỗi nhất quán bộ nhớ
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!