Lấy đoạn mã sau, những gì xảy ra trong một môi trường đa luồng:là nó chủ đề an toàn để gán một giá trị mới cho một đối tượng tĩnh trong C#
static Dictionary<string,string> _events = new Dictionary<string,string>();
public static Dictionary<string,string> Events { get { return _events;} }
public static void ResetDictionary()
{
_events = new Dictionary<string,string>();
}
Trong một môi trường đa luồng phương pháp này và tài sản có thể được truy cập trong cùng một thời gian bởi các chủ đề khác nhau.
Chủ đề có an toàn khi gán một đối tượng mới cho biến tĩnh có thể truy cập được trong các chuỗi khác nhau không? Điều gì có thể xảy ra?
Có thời điểm nào khi Sự kiện có thể trống không? Nếu 2 chủ đề gọi cùng lúc với số Events
và ResetDictionary()
chẳng hạn.
Nếu hai chủ đề gọi 'Events' và' ResetDictionary' đồng thời, thì điều * có thể xảy ra là: Thread 1 thực hiện điều gì đó với 'Events' và' Events' là một từ điển trống, * * hoặc ** Thread 2 gọi 'ResetDictionary' trước và sau đó một cái gì đó được thực hiện với nó bằng Thread 2.' Events' sẽ không kết thúc bằng 'null' trừ khi nó được đặt thành' null' bởi một luồng khác; điều này có thể dẫn đến một ngoại lệ con trỏ null, khi một thread kiểm tra 'Events! = null' trước khi' ResetDictionary' được gọi bởi một cái khác. – Nolonar
Sử dụng biến tĩnh mà bạn mong đợi giá trị biến không thay đổi (tương tự cho mỗi yêu cầu) hoặc thậm chí nếu thay đổi nó không ảnh hưởng đến ứng dụng của bạn (Tuy nhiên nó sẽ ảnh hưởng.), Có khả năng ứng dụng của bạn sẽ chạy sai logic và nó sẽ thậm chí không tăng bất kỳ ngoại lệ nào, hãy xem xét người dùng thay đổi bất kỳ giá trị nào và sau đó mọi yêu cầu đến khác xử lý dữ liệu sai cho đến khi giá trị được đặt lại bởi một số logic khác. Vì vậy, sử dụng các biến tĩnh một cách khôn ngoan. –