2015-06-11 33 views
8

不明白为什么mark()和reset()是同步的,为什么read()不是?为什么只有mark()和reset()方法在java.io.InputStream中同步?

+0

大概是因为比赛可能发生在标记和重置之间,但没有阅读。 – aioobe

+0

考虑到这些方法不会执行任何InputStream,有点奇怪。如果你看看支持标记/重置的ByterrayInputStream,你会发现大多数方法都是同步的,尽管'mark'方法不是(这对我来说有点难解)...... – assylias

+0

BufferedInputStream '同步' – Ian2thedv

回答

4

java.io.InputStream是一个抽象类。它有一个标记/重置的默认实现,它只在重置时抛出一个异常,告诉它不被支持,所以不支持它的子类不需要编写他们自己的抛出异常的方法。 “synchronized”对于默认情况并不有用,可以抛出异常。

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

我认为它没有任何作用。

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

相关问题