【问题标题】:Why only mark() and reset() method are synchronized in java.io.InputStream?为什么 java.io.InputStream 中只有 mark() 和 reset() 方法是同步的?
【发布时间】:2015-06-11 08:03:11
【问题描述】:

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

【问题讨论】:

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

标签: java synchronization


【解决方案1】:

java.io.InputStream 是一个抽象类。它有一个标记/重置的默认实现,只在重置时抛出一个异常,告诉它不受支持,因此不支持它的子类不需要编写自己的方法来抛出异常。 “同步”对于默认情况下没有用处,抛出异常。

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

我认为它没有任何影响。

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

【讨论】:

    猜你喜欢
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 2012-12-27
    • 2019-06-05
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    相关资源
    最近更新 更多