Khối đồng bộ trong java (Synchronized block) có thể được sử dụng để thực hiện đồng bộ hóa trên bất kỳ tài nguyên cụ thể nào của phương thức.
Giả sử có 50 dòng code trong phương thức, nhưng bạn chỉ muốn đồng bộ hóa 5 dòng, bạn có thể sử dụng khối đồng bộ.
Nếu bạn đặt tất cả các dòng code của phương thức trong khối đồng bộ, nó sẽ hoạt động giống như phương thức đồng bộ.
Các điểm cần nhớ về khối đồng bộ
- Khối đồng bộ được sử dụng để khóa một đối tượng cho bất kỳ tài nguyên dùng chung nào.
- Phạm vi của khối đồng bộ nhỏ hơn phương thức.
Khai báo để sử dụng khối đồng bộ:
synchronized (object reference expression) { //code block }
Nội dung chính
Ví dụ về khối đồng bộ
Dưới đây là ví dụ đơn giản về khối đồng bộ trong java.
File: TestSynchronizedBlock1.java
class Table { void printTable(int n) { synchronized (this) {// Khoi dong bo (synchronized block) for (int i = 1; i <= 5; i++) { System.out.println(n * i); try { Thread.sleep(400); } catch (Exception e) { System.out.println(e); } } } }// Ket thuc phuong thuc } class MyThread1 extends Thread { Table t; MyThread1(Table t) { this.t = t; } public void run() { t.printTable(5); } } class MyThread2 extends Thread { Table t; MyThread2(Table t) { this.t = t; } public void run() { t.printTable(100); } } public class TestSynchronizedBlock1 { public static void main(String args[]) { Table obj = new Table();// tao object duy nhat MyThread1 t1 = new MyThread1(obj); MyThread2 t2 = new MyThread2(obj); t1.start(); t2.start(); } }
Output:
5 10 15 20 25 100 200 300 400 500
Ví dụ tương tự về về khối đồng bộ bởi việc sử dụng lớp nặc danh
Dưới đây là ví dụ đơn giản về khối đồng bộ trong java sử dụng lớp nặc danh.
File: TestSynchronizedBlock2.java
class Table { void printTable(int n) { synchronized (this) { // khoi dong bo (synchronized block) for (int i = 1; i <= 5; i++) { System.out.println(n * i); try { Thread.sleep(400); } catch (Exception e) { System.out.println(e); } } } } // Ket thuc phuong thuc } public class TestSynchronizedBlock2 { public static void main(String args[]) { final Table obj = new Table();// tao object duy nhat Thread t1 = new Thread() { public void run() { obj.printTable(5); } }; Thread t2 = new Thread() { public void run() { obj.printTable(100); } }; t1.start(); t2.start(); } }
Output:
5 10 15 20 25 100 200 300 400 500