字符串是不可变的,这意味着一旦您修改了值,它就会创建一个新的引用并保持之前的引用值不变。
但是,当有人争论时,我不明白:
字符串是线程安全的,因为它们是不可变的
考虑下面的代码:
private String str = "1";
ExecutorService executorService = Executors.newFixedThreadPool(10);
IntStream.range(0, 1000).forEach((i)-> executorService.submit(()-> {
str = str +"1";
}));
executorService.awaitTermination(10, TimeUnit.SECONDS);
System.out.println(str.length());
如果它是线程安全的,那么它应该打印1001,而它总是打印小于预期值。
我知道上面的代码将创建1001不可变的引用,每个引用本身都是线程安全的,但作为开发人员,仍然不能使用不可变的东西并期望它end-result是线程安全的。
恕我直言,不变性不能保证线程安全。
有人可以向我解释一下 String 是如何线程安全的吗?
更新:
感谢您的回答,我知道每个字符串都可以是线程安全的,但我的观点是,当您在其他方法中使用它们时,线程安全性和不变性之间没有直接关系。
例如,不可变对象可以在有状态对象中使用并以非线程安全结果结束,而可变对象也可以在同步方法中使用并以线程安全结果结束。
喵喵时光机
largeQ
繁星淼淼
哆啦的时光机
随时随地看视频慕课网APP
相关分类