java – getResourceAsStream线程安全吗?

Web服务器上的代码:

public byte[] loadData() {
    byte[] data = null;
    try(final InputStream resourceStream = getClass().getResourceAsStream("data.bin")) { 
        data = ByteStreams.toByteArray(resourceStream); //ByteStreams is from Guava library
    } catch (IOException e) {
        e.printStackTrace();
    }
    return data;
}

几个线程在资源上打开流并读取其内容是否存在问题?在这种情况下,资源是jar中包含的数据文件.

在Windows上同时读取资源不是问题.但是效率不高所以我选择使用WeakReference和双重检查锁定只加载一次数据.

最佳答案
可能在您的线程之间共享的唯一状态是getResourceAsStream(String)返回的InputStream.让我们检查它是否是同一个对象.

这是一个非常简单的测试,您可以使用它来自己尝试:

InputStream first = getClass().getResourceAsStream("data.bin")
InputStream second = getClass().getResourceAsStream("data.bin")
System.out.println(first == second);

这将(通常)返回false.由于它们不是同一个对象,因此您没有线程安全问题.

我之所以这么说,是因为getResourceAsStream依赖于加载getClass()返回的Class实例的底层ClassLoader.所以,除非你正在编写和使用自己的(或第三方)ClassLoader对象,否则你会没事的.

转载注明原文:java – getResourceAsStream线程安全吗? - 代码日志