在线程之间传递对String的引用总是安全的吗?

时间:2016-11-15 10:22:27

标签: java multithreading concurrency thread-safety

根据java内存模型可以安全地在两个线程之间传递String

最简单的是以下总是安全的:

    public static void main(String[] args) throws Exception {
        String arg0 = args[0];
        CompletableFuture<Void> future = CompletableFuture.runAsync(() -> System.out.println(arg0));
        future.get();
    }

或类似的东西:

    public CompletableFuture<String> reallyNotAGoodImplementation(String arg1, String arg2) throws Exception {
        return CompletableFuture.supplyAsync(() -> arg1 + "," + arg2);
    }

在昨天之前我会毫不含糊地说这绝对是安全的,因为String是一个很好的不可变对象等,但我有理由相信这可能不会一直安全。

我正在运行的应用程序中有一些罕见的异常,表明在新线程中运行的Strings似乎无效,即具有空value字符数组。

说例外:

java.lang.NullPointerException
   at java.lang.String.length(String.java:623)

Caused by: java.lang.NullPointerException
   at java.lang.String.getBytes(String.java:941)

请注意,它们是来自String.length()String.getBytes()内部的NPE(java 1.8.0_77)

0 个答案:

没有答案