Synchronization (xử lý crictical section)

Một phần của tài liệu Xây dựng dịch vụ Chat trên mạng (Trang 68 - 70)

III- Cơ chế truyền nhận trong Java

b. Synchronization (xử lý crictical section)

Như đã nói ở trên, khả năng multithread do Java support mang lại nhiều lợi điểm. Tuy nhiên, điều gì sẽ xảy ra nếu hai thread truy xuất và làm thay đổi cùng một đối

SVTH: Bùi Thi Thu Hiền Trang 68

stop start Block On I/O I/O complete wait notify resume suspend sleep blocked runnable new deal done sleeping

tượng? Lý thuyết chung của vấn đề này vẫn là : phải đảm bảo trong quá trình một thread truy xuất và sửa đổi đối tượng dùng chung, nó không bị interrupted.

Ðể giải quyết vấn đề này (crictical section), môn hệ điều hành có một số phương pháp: dùng semaphore, các giải thuật của Peterson,monitors,testandset. Tuy nhiên, Java xử lý vấn đề này bằng synchronize access tới các đối tượng dùng chung, đây là hình thức sử dụng monitors, tuy nhiên việc sử dụng trong Java lại rất dễ dàng, hầu như chỉ là vấn đề khai báo. Ðơn giản là ta chỉ việc khai báo phương thức mà các thread gọi để truy xuất đối tượng dùng chung với từ khóa : synchronized

public synchronized void changeObject(. . .) {

. . . }

Sau đây là cơ cấu làm việc của synchronization:

1. Nếu một lớp có một hay nhiều phương thức synchronized, mỗi đối tượng của lớp nhận một hàng đợi, hàng đợi này giữ tất cả các thread đang đợi tới lượt thực thi một trong các phương thức synchronized.

2. Có 2 khả để một thread xếp vào hàng : gọi phương thức synchronized trong khi thread khác đang sử dụng đối tượng dùng chung, hoặc chính thread đó gọi wait trong khi đang dùng đối tượng.

3. Khi một lần gọi phương thức synchronized trả về, hay một phương thức khác gọi wait, thread khác nhận quyền truy xuất tới đối tượng.

4. Scheduler luôn chọn thread có mức ưu tiên cao nhất trong các thread đang trong hàng.

5. Nếu một thread bị đặt vào hàng do gọi wait, nó cần được "unfrozen" bởi việc gọi notify trước khi nó được scheduled để thực thi tiếp.

Các qui luật schedule khá phức tạp, nhưng sử dụng chúng lại khá đơn giản. Chỉ cần thực hiện ba qui tắc sau:

1. Nếu hai hay nhiều thread sửa đổi một đối tượng, khai báo các phương thức thực hiện việc sửa đổi với từ khóa synchronized.

2. Nếu một thread đợi sự thay đổi trạng thái của một đối tượng, nó nên đợi bên trong đối tượng, không phải bên ngồi, bằng cách vào phần thực thi của phương thức synchronized và gọi wait

3. Bất cứ khi nào một phương thức thay đổi trạng thái của một đối tượng, nó nên gọi notify(trước). Ðiều này làm các thread đang đợi có cơ hội.

Vấn đề này buộc phải xử lý trong đề án ở một số phương thức. Trong phần thực hiện Server, mỗi connection ứng với một client do một thread quản lý. Giả sử như có user_1 (client_1) thốt khỏi nhóm hiện hành của mình, khi đó thread_1 xử lý connection ứng với client này cần gọi hàm để xóa user khỏi nhóm. Nếu trong quá trình hàm xóa user khỏi nhóm đang thực thi mà thread bị interrupted, bởi một thread khác, thread_2, ứng với client_2 (user_2) cùng nhóm với user_1, muốn gửi một câu chat cho user_1. Sau đó thread_1 lại dành quyền điều khiển của thread_1, thực hiện xóa user_1 khỏi nhóm cũ. Thread_2 sau đó lại tiếp tục gửi câu chat cho user_1 lúc này không còn cùng nhóm với mình nữa. Vì thế buộc phải khai báo synchronized cho hàm xóa user khỏi nhóm .Còn một số tình huống khác trong phần thực hiện server buộc phải sử dụng synchronization, được mô tả kỹ hơn trong phần sau (phần 2).

Một phần của tài liệu Xây dựng dịch vụ Chat trên mạng (Trang 68 - 70)

Tải bản đầy đủ (DOC)

(112 trang)
w