× Giới thiệu Lịch khai giảng Tin tức Sản phẩm học viên

Từ khóa Synchronized trong Java -Cú pháp và ví dụ trong Java

22/09/2021 01:26

Trong bài viết này, chúng ta sẽ nghiên cứu từ khóa đồng bộ hóa - Synchronized trong Java, cách sử dụng từ khóa này trong Java và các ví dụ về từ khóa này. 

Vì sao cần sử dụng Từ khóa Synchronized trong Java

Khi làm việc trong môi trường đa luồng, đôi khi nhiều luồng trong chương trình cố gắng truy cập càng nhiều tài nguyên cùng một lúc. Tình huống này có thể dẫn đến lỗi hoặc các kết quả không được mong đợi.

Ví dụ, có một file hoặc hai hay nhiều luồng đang có viết chương trình trong cùng một file, tại cùng một thời điểm. Tình huống đồng thời này có thể dẫn đến việc một luồng cố mở một file trong khi luồng khác lại đang đóng nó. Trong trường hợp này, cả hai luồng đều không thể thực thi hành động trên tệp. Và nếu luồng đã truy cập vào tệp, nó có thể ghi đè dữ liệu đã được viết bởi một tệp khác, và điều này có thể gây gián đoạn dữ liệu.

Để khắc phục tình huống này, chúng ta cần đảm bảo rằng tại một thời điểm chỉ có một luồng duy nhất có thể truy cập tài nguyên tại một thời điểm nhất đinh. Đối với điều này, Java cung cấp một cơ chế đồng bộ hóa giúp tránh các điều kiện “chạy đua” như vậy bằng cách cung cấp quyền truy cập luồng được đồng bộ hóa vào tài nguyên hoặc dữ liệu được chia sẻ.

Trong bài viết này, chúng ta sẽ nghiên cứu từ khóa đồng bộ hóa - Synchronized trong Java, cách sử dụng từ khóa này trong Java và các ví dụ về từ khóa này. 

Từ khóa Synchronized trong Java

Vì Java là một ngôn ngữ đa luồng, nó hỗ trợ khái niệm quan trọng về đồng bộ hóa. Quá trình chỉ cho phép một luồng duy nhất truy cập vào dữ liệu hoặc tài nguyên được chia sẻ tại một thời điểm cụ thể được gọi là đồng bộ hóa - Synchronized. Điều này giúp chúng ta bảo vệ dữ liệu khỏi bị truy cập bởi nhiều luồng. Java cung cấp cơ chế đồng bộ hóa bằng cách sử dụng các khối được đồng bộ hóa. 

Chúng ta khai báo tất cả các khối được đồng bộ hóa trong Java bằng cách sử dụng từ khóa synchronized. Một khối được khai báo với một từ khóa synchronized trong Java đảm bảo rằng chỉ một luồng duy nhất thực thi tại một thời điểm cụ thể. Không có luồng nào khác có thể tham gia vào khối synchronized cho đến khi luồng bên trong khối đó hoàn thành thực thi và thoát khỏi khối. 

>>> Đọc thêm: Collections trong Java và cách sử dụng Collection Frameworks trong Java

Cú pháp sử dụng khối Synchronized trong Java

Dưới đây là cú pháp chung để viết một khối đồng bộ. Ở đây lockObject là một tham chiếu đến một đối tượng có khóa liên quan đến các câu lệnh được đồng bộ hóa. 

synchronized( lockObject )

{

// synchronized statements

}

Loại Synchronized trong Java

Có hai loại đồng hộ hóa trong Java:

Quá trình đồng bộ hóa trong Java

Đồng bộ hóa quy trình là thuật ngữ được sử dụng để định nghĩa Chia sẻ tài nguyên giữa hai hoặc nhiều quy trình và đồng thời đảm bảo tính không nhất quán của dữ liệu. Trong ngôn ngữ lập trình, đoạn mã đang được chia sẻ bởi các quy trình khác nhau được gọi là Phần quan trọng. Có nhiều giải pháp để tránh vấn đề phần quan trọng như Giải pháp của Peterson, cách phổ biến nhất để giải quyết vấn đề này là Semaphores.

Đồng bộ hóa chuỗi

Việc thực thi đồng thời tài nguyên quan trọng bởi hai hoặc nhiều Luồng được gọi là Đồng bộ hóa luồng. Luồng là chương trình con có thể thực thi độc lập trong một tiến trình duy nhất. Một quy trình duy nhất có thể chứa nhiều luồng và quy trình có thể lên lịch cho tất cả các luồng cho một tài nguyên quan trọng. Trên thực tế, một luồng đơn cũng chứa nhiều luồng.

>>> Đọc thêm: Deadlock trong Java - Cách tránh Deadlock trong lập trình Java

Ví dụ về Synchronization trong Java

Phương thức Synchronized Instance

Khi sử dụng khối được đồng bộ hóa với các phương thức thể hiện, thì mỗi đối tượng có phương thức được đồng bộ hóa của nó. Chỉ có thể có một luồng cho mỗi đối tượng, có thể thực thi bên trong một phương thức. Nếu có nhiều hơn một đối tượng, thì chỉ một luồng duy nhất có thể thực thi bên trong khối cho mỗi đối tượng.

public class MyCounter {

  private int count = 0;

  public synchronized void increment(int value) {

    this.count += value;

  }

  public synchronized void decrement(int value) {

    this.count -= value;

  }

}

 

Phương thức Synchronized Static

Chúng ta có thể đánh dấu phương thức Static như synchronized như cách chúng ta đánh dấu phương thức instance sử dụng từ khóa synchronized. Dưới đây là ví dụ của phương thức Synchronized Static

public static MyStaticCounter {

  private static int count = 0;

  public static synchronized void increment(int value) {

    count += value;

  }

}

Khối Synchronized trong phương thức Instance

Nếu bạn không muốn đồng bộ toàn bộ phương thức, bạn có thể làm một khối cụ thể bên trong phương thức như được đồng bộ hóa. Dưới đây là ví dụ về một khối bên trong phương thức Java không đồng bộ hóa.

 public class MyClass {

  public static void print(String message) {

    synchronized(MyClass.class) {

      log.writeln(message);

    }

  }

}

 

Nhu cầu sử dụng synchronized trong Java 

Chúng ta sử dụng từ khóa synchronized vì nó giúp thực hiện các hoạt động khác nhau liên quan đến lập trình đồng thời. Một số tính năng cần thiết của từ khóa được đồng bộ hóa là.

  • Từ khóa Synchronized trong Java cung cấp cơ sở khóa, đảm bảo rằng không có điều kiện chạy đua nào xảy ra giữa các luồng.
  • Từ khóa Synchronized cũng ngăn chặn việc sắp xếp lại các câu lệnh của chương trình
  • Từ khóa Synchronized cung cấp khóa và mở khóa. Luồng cần nhận được khóa trước khi vào bên trong khối được đồng bộ hóa, nó sẽ đọc dữ liệu từ bộ nhớ chính. Sau khi đọc dữ liệu, nó thực hiện thao tác ghi và sau đó giải phóng khóa.

Các yếu tố quan trọng của từ khóa synchronized trong Java 

  • Synchronized trong Java đảm bảo rằng chỉ một luồng duy nhất có thể truy cập dữ liệu được chia sẻ tại một thời điểm.
  • Sử dụng từ khóa đồng bộ hóa, chúng ta chỉ có thể tạo một khối hoặc một phương thức như đồng bộ hóa
  • Một luồng có được một khóa khi nó vào được bên trong một khối được đồng bộ hóa. Sau khi rời khỏi phương thức đó, luồng sẽ giải phóng khóa đó
  • Sử dụng từ khóa synchronized trong Java,  chúng ta không thể sử dụng nhiều hơn một JVM để cung cấp quyền kiểm soát truy cập vào tài nguyên được chia sẻ
  • Các hoạt động của hệ thống có thể bị suy giảm do quá trình hoạt động chậm của từ khóa synchronized

Kết luận:

Trong bài viết này, chúng ta đã thảo luận về các cách khác nhau để sử dụng từ khóa synchronized trong Java. Chúng ta có thể sử dụng nó với các phương thức hoặc khối của một phương thức. Hy vọng bạn đã nắm rõ về synchronized trong Java. Tìm hiểu thêm về Java và các ngôn ngữ lập trình khác qua các khóa học lập trình tại  Viện công nghệ thông tin T3H.