Từ khóa được đồng bộ hóa Java
Ví dụ
Sử dụng công cụ sửa đổi synchronized
để ngăn tình trạng chạy đua giữa các luồng:
public class Main implements Runnable { public static int a, b; public static void main(String[] args) { a = 100; b = 100; // Check the total amount shared between a and b before the transfers System.out.println("Total before: " + (a + b)); // Run threads which will transfer amounts between a and b Thread thread1 = new Thread(new Main()); Thread thread2 = new Thread(new Main()); thread1.start(); thread2.start(); // Wait for the threads to finish running try { thread1.join(); thread2.join(); } catch (InterruptedException e) { e.printStackTrace(); } // Check the total amount shared between a and b after the transfers // It should be the same amount as before System.out.println("Total after: " + (a + b)); } public void run() { for (int i = 0; i < 10000000; i++) { transfer(); } } public static synchronized void transfer() { // Choose a random amount to transfer int amount = (int) (5.0 * Math.random()); // Transfer between a and b if (a > b) { a -= amount; b += amount; } else { a += amount; b -= amount; } } }
Định nghĩa và cách sử dụng
Từ khóa synchronized
là một công cụ sửa đổi khóa một phương thức để mỗi lần chỉ có một luồng có thể sử dụng nó. Điều này ngăn chặn các vấn đề phát sinh từ điều kiện chạy đua giữa các luồng.
Trong ví dụ trên, việc xóa từ khóa synchronized
khỏi phương thức transfer()
có thể khiến giá trị của a
và b
bị sửa đổi bởi một luồng khác giữa các thao tác. Điều này sẽ dẫn đến tổng số tiền giữa hai biến thay đổi.
Trang liên quan
Đọc thêm về các công cụ sửa đổi trong Hướng dẫn về công cụ sửa đổi Java của chúng tôi.
Đọc thêm về chủ đề trong Hướng dẫn về chủ đề Java của chúng tôi.