为什么在java.io.InputStream中只同步mark()和reset()方法?

为什么在java.io.InputStream中只同步mark()和reset()方法?,java,synchronization,Java,Synchronization,不明白为什么mark()和reset()是同步的,为什么read()不是?java.io.InputStream是一个抽象类。它有一个默认的mark/reset实现,只在重置时抛出一个不受支持的异常,因此不支持它的子类不需要编写自己的抛出异常的方法。“synchronized”在默认情况下不适用于引发异常 任何支持它的子类都必须重写这些方法,并且同步不会被继承,因此被重写的方法可能会被同步,也可能不会被同步 我认为没有任何效果 我猜这是一个没有后果的设计缺陷,或者可能是一个警告,因此程序员将其子

不明白为什么mark()和reset()是同步的,为什么read()不是?

java.io.InputStream是一个抽象类。它有一个默认的mark/reset实现,只在重置时抛出一个不受支持的异常,因此不支持它的子类不需要编写自己的抛出异常的方法。“synchronized”在默认情况下不适用于引发异常

任何支持它的子类都必须重写这些方法,并且同步不会被继承,因此被重写的方法可能会被同步,也可能不会被同步

我认为没有任何效果


我猜这是一个没有后果的设计缺陷,或者可能是一个警告,因此程序员将其子类化以同步这些方法,因为应该这样做。

可能是因为标记和重置之间可能会发生竞争,但不会读取。考虑到这些方法不执行任何InputStream操作,这有点奇怪。如果您查看支持标记/重置的ByterrayInputStream,您将看到大多数方法都是同步的,尽管
标记
方法不是(这对我来说有点困惑).
BufferedInputStream
的读取方法是
同步的