Rate this post

Trong Java, từ khóa synchronized được sử dụng để đảm bảo rằng một phương thức hoặc một khối lệnh chỉ được thực thi bởi một thread duy nhất tại một thời điểm. Nó giúp ngăn chặn việc xảy ra race condition, tức là việc hai hoặc nhiều thread cùng truy cập và thay đổi cùng một tài nguyên dữ liệu đang chia sẻ.

Các bài viết liên quan:

Có hai cách để sử dụng synchronized trong Java:

  1. Sử dụng từ khóa synchronized trước một phương thức hoặc một khối lệnh để cho biết rằng phương thức hoặc khối lệnh đó chỉ được thực thi bởi một thread duy nhất tại một thời điểm.
public synchronized void incrementCounter() {
    counter++;
}
  1. Sử dụng synchronized block trong một khối lệnh bất kỳ để cho biết rằng khối lệnh đó chỉ được thực thi bởi một thread duy nhất tại một thời điểm.
public void incrementCounter() {
    synchronized (this) {
        counter++;
    }
}

Trong cả hai trường hợp, một thread sẽ khóa một đối tượng hoặc một class nào đó trước khi thực thi phương thức hoặc khối lệnh được chứa trong synchronized block, và sẽ mở khóa sau khi thực thi xong. Điều này giúp đảm bảo rằng chỉ có một thread được thực thi trong một thời điểm, tránh việc hai thread cùng truy cập và thay đổi cùng một tài nguyên dữ liệu đang chia sẻ, và tăng tính nhất quán của chương trình.

Lưu ý rằng sử dụng synchronized có thể giảm hiệu suất của chương trình do một thread phải chờ đợi để sử dụng tài nguyên đang được sử dụng bởi một thread khác. Do đó, nên chỉ sử dụng synchronized khi cần thiết và đảm bảo rằng thời gian chờ đợi là cần thiết và thấp nhất có thể.

Một số ví dụ về synchronized trong java

  1. Sử dụng synchronized trong một phương thức để đảm bảo rằng chỉ một thread được thực thi cùng một lúc :
public class Counter {
    private int count = 0;
    public synchronized void increment() {
        count++;
    }
}
  1. Sử dụng synchronized trong một khối lệnh để chỉ cho một thread thực thi một block cụ thể :
public class BankAccount {
    private int balance = 0;
    public void deposit(int amount) {
        synchronized(this) {
            balance += amount;
        }
    }
    public void withdraw(int amount) {
        synchronized(this) {
            balance -= amount;
        }
    }
}
  1. Sử dụng synchronized trong một class để chỉ cho một thread thực thi một phương thức trong class đó :
public class Singleton {
    private static Singleton instance;
    private Singleton() { }
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
  1. Sử dụng synchronized trong một block trong nhiều thread để chỉ cho một thread thực thi block đó :
class Task implements Runnable {
    private final Object lock;
    public Task(Object lock) {
        this.lock = lock;
    }
    public void run() {
        synchronized (lock) {
            // Perform a task
        }
    }
}

Trong các ví dụ trên chỉ là một số trong nhiều cách sử dụng synchronized trong Java, có thể có nhiều cách khác để sử dụng synchronized tùy theo nhu cầu của chương trình.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Contact Me on Zalo
Call now