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
依赖于加载返回的
。因此,除非您正在编写和使用您自己的(或第 3 方)Class
实例的底层ClassLoader
>getClass()ClassLoader
对象,否则您会没事的。
关于java - getResourceAsStream 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25936000/