!
%
(
$
+
%
%
)
%
Hình 8.7 Kết quả hiển thị của chương trình 8.7 không có sự đồng bộ
Sử dụng khối đồng bộ (Synchronized Block)
Tạo ra các phương thức synchronzed (đồng bộ) trong phạm vi các lớp là một con
đường dễ dàng và có hiệu quả của việc thực hiện sự đồng bộ. Tuy nhiên, điều này không
làm việc trong tất cả các trường hợp.
Hãy xem một trường hợp nơi mà lập trình viên muốn sự đồng bộ được xâm nhập
vào các đối tượng của lớp mà không được thiết kế cho thâm nhập đa luồng. Tức là, lớp
không sử dụng các phương thức đồng bộ. Hơn nữa, mã nguồn là không có giá trị. Vì thế từ
khoá synchronized không thể được thêm vào các phương thức thích hợp trong phạm vi
lớp.
Để đồng bộ thâm nhập một đối tượng của lớp này, tất cả chúng gọi các phương
thức mà lớp này định nghĩa, được đặt bên trong một khối đồng bộ. Tất cả chúng sử dụng
chung một câu lệnh đồng bộ được cho như sau:
synchronized(object)
{
// các câu lệnh đồng bộ
}
Ở đây, “object” (đối tượng) là một tham chiếu đến đối tượng được đồng bộ. Dấu
ngoặc móc không cấn thiết khi chỉ một câu lệnh được đồng bộ. Một khối đồng bộ bảo đảm
rằng nó gọi đến một phương thức (mà là thành phần của đối tượng) xuất hiện chỉ sau khi
luồng hiện hành đã được tham nhập thành công vào monitor (sự quan sát) của đối tượng.
Chương trình 8.5 chỉ ra câu lệnh đồng bộ sử dụng như thế nào:
Chương trình 8.5
class Target {
/**
* Target constructor comment.
*/
synchronized void display(int num) {
System.out.print("<> "+num);
try{
Thread.sleep(1000);
}catch(InterruptedException e){
System.out.println("Interrupted");
}
System.out.println(" <>");