JavaRush /Blog Java /Random-VI /Đồng bộ hóa luồng, khóa đối tượng và khóa lớp
CynepHy6
Mức độ
Великий Новгород

Đồng bộ hóa luồng, khóa đối tượng và khóa lớp

Xuất bản trong nhóm
Đồng bộ hóa luồng, khóa đối tượng và khóa lớp - 1Đồng bộ hóa đề cập đến đa luồng. Một khối mã được đồng bộ hóa chỉ có thể được thực thi bởi một luồng tại một thời điểm. Java hỗ trợ nhiều luồng để thực thi. Điều này có thể dẫn đến hai hoặc nhiều luồng truy cập vào cùng một trường hoặc đối tượng. Đồng bộ hóa là một quá trình cho phép tất cả các luồng song song trong chương trình chạy đồng bộ. Đồng bộ hóa tránh các lỗi nhất quán của bộ nhớ do truy cập không nhất quán vào bộ nhớ dùng chung. Khi một phương thức được khai báo là được đồng bộ hóa, luồng sẽ giữ một trình giám sát đối tượng có phương thức đang được thực thi. Nếu một luồng khác đang thực thi một phương thức được đồng bộ hóa, luồng của bạn sẽ chặn cho đến khi luồng kia nhả màn hình. Việc đồng bộ hóa đạt được trong Java bằng cách sử dụng một từ dành riêng synchronized. Bạn có thể sử dụng nó trong các lớp của mình bằng cách xác định các phương thức hoặc khối được đồng bộ hóa. Bạn sẽ không thể sử dụng synchronizedin biến hoặc thuộc tính trong định nghĩa lớp.

Khóa cấp đối tượng

Đây là một cơ chế để đồng bộ hóa một phương thức không tĩnh hoặc khối mã không tĩnh sao cho chỉ một luồng có thể thực thi một khối hoặc phương thức nhất định trên một thể hiện nhất định của một lớp. Việc này nên được thực hiện bất cứ khi nào bạn cần đảm bảo an toàn cho luồng dữ liệu cấp phiên bản. Ví dụ:
public class DemoClass{
    public synchronized void demoMethod(){}
}
hoặc
public class DemoClass{
    public void demoMethod(){
        synchronized (this)        {
            //other thread safe code
        }
    }
}
hoặc
public class DemoClass{
    private final Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

Khóa cấp lớp

Ngăn chặn nhiều luồng đi vào một khối được đồng bộ hóa trong khi thực thi trong bất kỳ phiên bản nào có sẵn của lớp. Điều này có nghĩa là nếu có 100 phiên bản của lớp trong quá trình thực thi một chương trình DemoClassthì chỉ một luồng tại thời điểm đó có thể thực thi demoMethod()trong bất kỳ trường hợp nào và tất cả các trường hợp khác sẽ bị chặn đối với các luồng khác. Điều này là cần thiết khi bạn cần đảm bảo an toàn cho luồng dữ liệu tĩnh.
public class DemoClass{
    public synchronized static void demoMethod(){}
}
hoặc
public class DemoClass{
    public void demoMethod(){
        synchronized (DemoClass.class)        {
            //other thread safe code
        }
    }
}
hoặc
public class DemoClass
{
    private final static Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

Một số lưu ý quan trọng

  1. Đồng bộ hóa trong Java đảm bảo rằng không có hai luồng nào có thể thực thi một phương thức được đồng bộ hóa cùng một lúc hoặc song song.

  2. synchronizedchỉ có thể được sử dụng với các phương thức và khối mã. Các phương thức hoặc khối này có thể tĩnh hoặc không tĩnh.

  3. Bất cứ khi nào một luồng bất kỳ đi vào một phương thức hoặc khối được đồng bộ hóa, nó sẽ nhận được một khóa và bất cứ khi nào một luồng thoát ra khỏi một phương thức được đồng bộ hóa hoặc chặn thì JVM sẽ giải phóng khóa đó. Khóa được giải phóng ngay cả khi luồng rời khỏi phương thức được đồng bộ hóa sau khi hoàn thành do bất kỳ lỗi hoặc ngoại lệ nào.

  4. synchronizedtrong Java , điều này có nghĩa là nếu một phương thức được đồng bộ hóa gọi một phương thức được đồng bộ hóa khác yêu cầu cùng một khóa, thì luồng hiện tại giữ khóa có thể nhập phương thức đó mà không cần lấy khóa.

  5. Синхронизация в Java будет бросать NullPointerException если an object используемый в синхронизированном блоке null. Например, в вышеприведенном примере codeа, если замок инициализируется How null, синхронизированный (lock) бросит NullPointerException.

  6. Синхронизированные методы в Java вносят дополнительные затраты на производительность вашего applications. Так что используйте синхронизацию, когда она абсолютно необходима. Кроме того, рассмотрите вопрос об использовании синхронизированных блоков codeа для синхронизации только критических секций codeа.

  7. Вполне возможно, что и статический и не статический синхронизированные методы могут работать одновременно or параллельно, потому что они захватывают замок на другой an object.

  8. В соответствии со спецификацией языка вы не можете использовать synchronized в конструкторе это приведет к ошибке компиляции.

  9. Не синхронизируйте по не финальному (no final) полю, потому что link, на не финальное поле может измениться в любое время, а затем другой поток может получить синхронизацию на разных an objectх и уже не будет ниHowой синхронизации вообще. Лучше всего использовать класс String, который уже неизменяемый и финальный.

Удачи в обучении!! Оригинал: Object level lock vs Class level lock in Java
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION