我正在使用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/

10-14 05:08