Tôi đang sử dụng một khối mã tĩnh để khởi tạo một số bộ điều khiển trong sổ đăng ký mà tôi có. Do đó, câu hỏi của tôi là, tôi có thể đảm bảo rằng khối mã tĩnh này sẽ chỉ được gọi hoàn toàn một lần khi lớp được tải lần đầu tiên không? Tôi hiểu rằng tôi không thể đảm bảo khi nào khối mã này sẽ được gọi, tôi đoán nó khi Trình tải lớp đầu tiên tải nó. Tôi nhận ra rằng tôi có thể đồng bộ hóa trên lớp trong khối mã tĩnh, nhưng tôi đoán đây thực sự là những gì xảy ra?
Ví dụ mã đơn giản sẽ là;
class FooRegistry {
static {
//this code must only ever be called once
addController(new FooControllerImpl());
}
private static void addController(IFooController controller) {
// ...
}
}
hoặc tôi nên làm điều này;
class FooRegistry {
static {
synchronized(FooRegistry.class) {
addController(new FooControllerImpl());
}
}
private static void addController(IFooController controller) {
// ...
}
}