CÁC GIẢI PHÁP LẬP TRÌNH C# - Trang 149

149

Chương 4: Tiểu trình, tiến trình, và sự đồng bộ

(với kiểu phù hợp) làm đối số và trả về một đối tượng cung cấp một vỏ bọc được-đồng-bộ-hóa
(synchronized wrapper) bao lấy đối tượng tập hợp đã được chỉ định. Đối tượng vỏ bọc này có
cùng kiểu với tập hợp gốc, nhưng tất cả các phương thức và thuộc tính dùng để đọc và ghi tập
hợp bảo đảm rằng chỉ một tiểu trình có khả năng truy xuất nội dung của tập hợp cùng lúc.
Đoạn mã dưới đây trình bày cách tạo một

Hashtable

có tính chất an-toàn-về-tiểu-trình (bạn có

thể kiểm tra một tập hợp có phải là an-toàn-về-tiểu-trình hay không bằng thuộc tính

IsSynchronized

).

// Tạo một Hashtable chuẩn.

Hashtable hUnsync = new Hashtable();

// Tạo một vỏ bọc được-đồng-bộ-hóa.

Hashtable hSync = Hashtable.Synchronized(hUnsync);

Các lớp tập hợp như

HybridDictionary

,

ListDictionary

, và

StringCollection

(thuộc không

gian tên

System.Collections.Specialized

) không hiện thực phương thức

Synchronized

. Để

cung cấp khả năng truy xuất an-toàn-về-tiểu-trình đến thể hiện của các lớp này, bạn phải hiện
thực quá trình đồng bộ hóa (sử dụng đối tượng được trả về từ thuộc tính

SyncRoot

) như được

trình bày trong đoạn mã dưới đây:

// Tạo một NameValueCollection.

NameValueCollection nvCollection = new NameValueCollection();

// Thu lấy chốt trên NameValueCollection trước khi thực hiện sửa đổi.

lock (((ICollection)nvCollection).SyncRoot) {

// Sửa đổi NameValueCollection...

}

Chú ý rằng lớp

NameValueCollection

dẫn xuất từ lớp

NameObjectCollectionBase

, lớp cơ sở

này sử dụng cơ chế hiện thực giao diện tường minh để hiện thực thuộc tính

ICollection.SyncRoot

. Như đã được trình bày, bạn phải ép

NameValueCollection

về

ICollection

trước khi truy xuất thuộc tính

SyncRoot

. Việc ép kiểu là không cần thiết đối với

các lớp tập hợp chuyên biệt như

HybridDictionary

,

ListDictionary

, và

StringCollection

(các lớp này không sử dụng cơ chế hiện thực giao diện tường minh để hiện thực

SyncRoot

).

Nếu cần sử dụng rộng khắp lớp tập hợp đã được đồng bộ hóa, bạn có thể đơn giản hóa mã
lệnh bằng cách tạo một lớp mới dẫn xuất từ lớp tập hợp cần sử dụng. Kế tiếp, chép đè các
thành viên của lớp cơ sở cung cấp khả năng truy xuất nội dung của tập hợp và thực hiện đồng
bộ hóa trước khi gọi thành viên lớp cơ sở tương đương. Bạn có thể sử dụng lệnh

lock

một

cách bình thường để đồng bộ hóa đối tượng được trả về bởi thuộc tính

SyncRoot

của lớp cơ sở

như đã được thảo luận ở trên. Tuy nhiên, bằng cách tạo lớp dẫn xuất, bạn có thể hiện thực các
kỹ thuật đồng bộ hóa cao cấp hơn, chẳng hạn sử dụng

System.Threading.ReaderWriterLock

để cho phép nhiều tiểu trình đọc nhưng chỉ một tiểu trình ghi.

10.

10.

Kh i ch y m t ti n trình m i

ở ạ ộ ế

Kh i ch y m t ti n trình m i

ở ạ ộ ế

Bạn cần thực thi một ứng dụng trong một tiến trình mới.

Liên Kết Chia Sẽ

** Đây là liên kết chia sẻ bới cộng đồng người dùng, chúng tôi không chịu trách nhiệm gì về nội dung của các thông tin này. Nếu có liên kết nào không phù hợp xin hãy báo cho admin.