Nói cách khác, chủ đề triển khai Singleton này có an toàn không:
public class Singleton
{
private static Singleton instance;
private Singleton() { }
static Singleton()
{
instance = new Singleton();
}
public static Singleton Instance
{
get { return instance; }
}
}
X
cuối cùng -1
thậm chí không có luồng . Nó không phải là một vấn đề an toàn chủ đề. Thay vào đó, trình khởi tạo x = -1
chạy trước (nó nằm trên một dòng trước đó trong mã, số dòng thấp hơn). Sau đó, trình khởi X = GetX()
chạy chạy, làm cho chữ hoa X
bằng -1
. Và sau đó, hàm tạo tĩnh "tường minh", trình khởi tạo kiểu static C() { ... }
chạy, chỉ thay đổi chữ thường x
. Vì vậy, sau tất cả điều đó, Main
phương thức (hoặc Other
phương thức) có thể tiếp tục và đọc chữ hoa X
. Giá trị của nó sẽ là -1
, thậm chí chỉ với một luồng.
Instance
cùng một lúc. Một trong các luồng sẽ được yêu cầu trước tiên chạy trình khởi tạo kiểu (còn được gọi là hàm tạo tĩnh). Trong khi đó, tất cả các luồng khác muốn đọc thuộcInstance
tính, sẽ bị khóa cho đến khi trình khởi tạo kiểu kết thúc. Chỉ sau khi trình khởi tạo trường kết thúc, các luồng sẽ được phép nhậnInstance
giá trị. Vì vậy, không ai có thể nhìn thấyInstance
đượcnull
.