Uma correção simples seria substituir os componentes internos do wrapper para usar o Threadlocal.
Portanto, o format()
é alterado de:
private DecimalFormat format = new ...;
private final Object lock = new Object();
public String format(double value){
synchronized(lock) {
return format.format(value);
}
}
para
private ThreadLocal<DecimalFormat> format = new ThreadLocal(){
public DecimalFormat initialValue(){
return new ...;
}
};
public String format(double value){
return threadLocalFormat.get().format(value);
}
Isso tem a vantagem de que a nova implementação é threadsafe sem o custo de sincronizar as chamadas e a interface para todas as outras classes permanece a mesma. Assim, a mudança é localizada em apenas uma classe.