2

我正在与一家使用带有 Java 的 struts 生成 Web 应用程序的公司合作。我最近一直在重构很多代码来整理系统。我一直在使用的一种技术是将方法的流的关闭语句(在finally块中)移动到实用程序类。实用程序类是静态的,并且具有各种类型的流的关闭方法。通过进行这种重构,我每次需要关闭流时节省了 5 行代码,这将某些类中的代码减少了 600 行,使其非常有利。但是我担心这样做如果投入生产可能会引起对这些方法的争用。

我之前只在多线程编程中遇到过争用的概念,这就是为什么我不确定这是否会在这些实例中引起问题。

这可能吗?或者只是我对争用、静态方法、Web 应用程序等的误解?

在此先感谢,阿列克谢蓝。

4

3 回答 3

2

最佳做法是关闭同一范围内的所有打开文件处理程序。例如,当文件输出流在方法中打开时,它也应该在该方法中关闭。这也可以防止大多数并发问题(但并非总是如此)。但是,不这样做有很多例外,但在这种情况下跟踪和关闭所有文件处理程序会更加困难。

仅供参考,存在一种关闭方法,它完全符合您在 Apache Common IO IOUtils中描述的功能。这是一个您可以考虑使用的流行库。

于 2011-11-30T09:57:02.690 回答
1

除非静态方法仅对其参数进行操作,并且您不会尝试多次同时关闭同一个流,否则应该没问题。

通常方法可以同时执行。同步将始终对对象起作用,因此如果您在这些方法中使用的对象完全不同,则不应发生争用。

于 2011-11-30T09:49:12.200 回答
1

这是一种常见的做法,例如查看 Guava 中的 Closeables 类。顺便说一句,您应该只需要一种方法就可以关闭 Java 中的几乎任何东西:

public static void closeQuietly(Closeable closeable) {
  if (closeable != null) {
    try {
      closeable.close();
    } catch (RuntimeException re) {
      // Do something or ignore...
    }
  }
}

由于所有的 Streams 和 Readers 都实现了 Closeable 接口,因此这一种方法应该足以满足您的所有需求。

一般来说,这不会引起争用,除非你尝试从线程 A 中的流中读取,线程 B 正在关闭流。但如果是这样的话,那么无论有没有这种重构,你都会有这种争论。仅此重构不会引入任何额外的争用。

于 2011-11-30T09:54:59.630 回答