Nếu bạn tạo ra bất kỳ phương thức nào với từ khóa synchronized được gọi là phương thức đồng bộ static, khi đó khóa sẽ được sử dụng trên lớp không phải trên đối tượng.
Vấn đề khi không sử dụng phương thức đồng bộ static
Giả sử có hai đối tượng của một lớp được chia sẻ (ví dụ: Table) có tên object1 và object2. Trong trường hợp phương thức đồng bộ và khối đồng bộ không thể can thiệp giữa t1 và t2 hoặc t3 và t4 vì t1 và t2 đều tham chiếu đến một đối tượng chung có một khóa duy nhất. Nhưng có thể có sự va chạm giữa t1 và t3 hoặc t2 và t4 bởi vì t1 lấy được một khóa khác và t3 có được một khóa khác. Tôi không muốn sự xen vào giữa t1 và t3 hoặc t2 và t4. Phương thức đồng bộ hóa static được sử dụng để giải quyết vấn đề này.
Nội dung chính
Ví dụ về phương thức đồng bộ hóa static
Trong ví dụ này chúng ta áp dụng từ khóa synchronized trên phương pháp tĩnh để thực hiện đồng bộ hóa static.
File: TestSynchronization4.java
class Table { synchronized static void printTable(int n) { for (int i = 1; i <= 10; i++) { System.out.println(n * i); try { Thread.sleep(400); } catch (Exception e) { } } } } class MyThread1 extends Thread { public void run() { Table.printTable(1); } } class MyThread2 extends Thread { public void run() { Table.printTable(10); } } class MyThread3 extends Thread { public void run() { Table.printTable(100); } } class MyThread4 extends Thread { public void run() { Table.printTable(1000); } } public class TestSynchronization4 { public static void main(String t[]) { MyThread1 t1 = new MyThread1(); MyThread2 t2 = new MyThread2(); MyThread3 t3 = new MyThread3(); MyThread4 t4 = new MyThread4(); t1.start(); t2.start(); t3.start(); t4.start(); } }
Output:
1 2 3 4 5 6 7 8 9 10 10 20 30 40 50 60 70 80 90 100 100 200 300 400 500 600 700 800 900 1000 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000
Ví dụ về phương thức đồng bộ hóa static sử dụng lớp nặc danh
Trong ví dụ này, chúng ta sử dụng lớp nặc danh để tạo các thread.
File: TestSynchronization5.java
class Table { synchronized static void printTable(int n) { for (int i = 1; i <= 10; i++) { System.out.println(n * i); try { Thread.sleep(400); } catch (Exception e) { } } } } public class TestSynchronization5 { public static void main(String[] args) { Thread t1 = new Thread() { public void run() { Table.printTable(1); } }; Thread t2 = new Thread() { public void run() { Table.printTable(10); } }; Thread t3 = new Thread() { public void run() { Table.printTable(100); } }; Thread t4 = new Thread() { public void run() { Table.printTable(1000); } }; t1.start(); t2.start(); t3.start(); t4.start(); } }
Output:
1 2 3 4 5 6 7 8 9 10 10 20 30 40 50 60 70 80 90 100 100 200 300 400 500 600 700 800 900 1000 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000