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和仔细检查的锁定来仅加载一次数据。

Sotirios Delimanolis

您的线程之间唯一可能共享的状态InputStream返回getResourceAsStream(String)让我们检查一下是否是同一对象。

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

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

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


之所以这样说,通常是因为getResourceAsStream取决于ClassLoader加载了Class返回实例的基础getClass()因此,除非您正在编写和使用自己的(或第三方)ClassLoader对象,否则就可以了。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章