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.