我正在使用java.io.FileWriter将一些数据写入磁盘。
如您所知,FileWriter扩展了OutputStreamWriter,而后者又扩展了Writer。
当我查看Writer的write(..)时,令我惊讶的是它是同步的。
**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);
}
}
我很好奇为什么在基本Writer类中同步写入?
对于我的用例,我只有一个writer线程,并且完全不需要同步writes(..)。
我知道获取无竞争锁比竞争锁要快得多。但是,使基本Writer类同步的整个工作对我来说似乎不是一个好的设计。
我错过了一个未同步的Writer类吗?
谢谢
最佳答案
不管您是否需要线程安全,此实现都将正确运行。这意味着它将适用于最广泛的用例。
如果您每次仅使用同一线程锁定一个对象,它将非常有效地执行此操作(如果您启用了偏向锁定,这是默认设置)
它的开销非常小,您可以在CPU绑定(bind)的任务中进行测量,但是大约是实际写入IO的延迟的1/1000。也就是说,您将无法区分用例。
关于java - 为什么write(..)方法java.io.Writer是同步的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35653873/