Eu estou usando java.io.FileWriter para gravar alguns dados no disco. Como você sabe, o FileWriter estende o OutputStreamWriter, que por sua vez estende o Writer.
Quando eu olhei para Writer "s write (..), para minha surpresa está sincronizado.
**java.io.Writer**
public void write(int c) throws IOException {
synchronized (lock) {
if (writeBuffer == null){
writeBuffer = new char[WRITE_BUFFER_SIZE];
}
writeBuffer[0] = (char) c;
write(writeBuffer, 0, 1);
}
}
Estou curioso para saber por que as gravações são sincronizadas na classe base do Writer? Para o meu caso de uso, eu só tenho um thread de escritor e não tenho absolutamente nenhuma necessidade de que as gravações (..) sejam sincronizadas.
Estou ciente de que a aquisição de bloqueios não contidos é muito mais rápida que bloqueios contidos. No entanto, todo esse negócio de ter a base da classe Writer sincronizada não parece um bom design para mim.
Existe uma classe Writer não sincronizada que perdi?
obrigado
Respostas:
2 para resposta № 1Estou curioso para saber por que as gravações são sincronizadas na classe base do Writer?
Essa implementação funcionará corretamente se você precisar que ela seja thread-safe ou não. Isso significa que ele funcionará com o maior número de casos de uso.
Para o meu caso de uso, eu só tenho um thread de escritor e não tenho absolutamente nenhuma necessidade de que as gravações (..) sejam sincronizadas.
Se você sempre bloquear um objeto usando o mesmo thread a cada vez, ele fará isso de maneira muito eficiente (se você tiver o bloqueio polarizado ativado, que é o padrão)
Existe uma classe Writer não sincronizada que perdi?
Tem uma sobrecarga muito pequena que você podemedida em tarefas ligadas à CPU, mas será em torno de 1 / 1000º o atraso da gravação real em IO. ou seja, você não será capaz de dizer a diferença para o seu caso de uso.