java - getResourceAsStream 线程安全吗?

标签 java multithreading

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 依赖于加载返回的Class 实例的底层ClassLoader >getClass()。因此,除非您正在编写和使用您自己的(或第 3 方)ClassLoader 对象,否则您会没事的。

关于java - getResourceAsStream 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25936000/

相关文章:

java - TimescaleDB 的插入速度比普通 postgresql 10 慢

Java:二进制序列表示

c++ - 线程(尝试使用已删除的函数

multithreading - 当多个线程尝试完全同时访问关键部分时,会发生什么情况?

Java OpenCV haarcascade_frontalface_default.xml

java - "The constructor ... is ambiguous"是什么意思?

c# - 访问 Outlook 的公用文件夹 : Java or C#

.net - ThreadPool.QueueUserWorkItem 完成事件?

c# - 寻找一些 UI 线程和工作线程教程

multithreading - Java虚拟机如何实现 "happens-before"内存模型?