根据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)