为什么write(..)方法java.io.Writer同步?

时间:2016-02-26 14:09:23

标签: java multithreading file-io io filewriter

我正在使用java.io.FileWriter将一些数据写入磁盘。 如您所知,FileWriter扩展了OutputStreamWriter,后者又扩展了Writer。

当我看着Writer的写(..)时,令我惊讶的是它是同步的。

**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类同步的整个业务对我来说看起来不是一个好设计。

我错过了一个未同步的Writer类吗?

由于

1 个答案:

答案 0 :(得分:2)

  

我很好奇为什么写入在基类Writer类中同步?

无论您是否需要线程安全,此实现都将正常工作。这意味着它将适用于最广泛的用例。

  

对于我的用例,我只有一个编写器线程,并且完全不需要同步写入(..)。

如果您每次只使用相同的线程锁定对象,它将非常有效地执行此操作(如果您启用了偏向锁定,这是默认设置)

  

我错过了一个未同步的Writer类吗?

它具有非常小的开销,您可以在CPU绑定任务中测量它,但它将是实际写入IO的延迟的1/1000左右。即你无法告诉你用例的区别。