С какой целью вы используете замок здесь;просто чтобы гарантировать, что timer.scheduleAtFixedRate
вызывается только один раз (при первом вызове конструктора A
)?
Вместо этого вы можете сделать это в статическом инициализаторе, так что вам не нужноБлокировка вообще:
public class A {
private static final Timer timer = new Timer();
private static final ConcurrentHashMap<String,B> _b_dict = new ConcurrentHashmap<String,B>();
static {
timer.scheduleAtFixedRate(new TimerTaskThread(), new Date(), 60000);
}
// etc.
}
Если вы используете статический блок, планирование будет выполняться при инициализации класса (после его загрузки), а не при первом создании его экземпляра.
Другой возможностью является использование AtomicBoolean
:
public class A {
private static final Timer timer = new Timer();
private static final AtomicBoolean initDone = new AtomicBoolean();
private static final ConcurrentHashMap<String,B> _b_dict = new ConcurrentHashmap<String,B>();
public A() {
if (!initDone.getAndSet(true)) {
timer.scheduleAtFixedRate(new TimerTaskThread(), new Date(), 60000);
}
}
// etc.
}