比如StringBuilder在多线程中使用会导致线程不安全,这个不安全会产生什么后果,是数据不正确或丢失.?
比方说线程 A 正在遍历一个 List
for (int i = 0, max = list.size(); i < max; i++) {
...
}
遍历的过程中,来了个线程 B,把 list 里面删了个元素,那么线程 A 遍历到最后就会出现 IndexOutOfBoundsException,为什么,因为实际的元素的数量已经变成 max - 1 了啊。
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
我先给上一段代码,你可以自己运行一下试一试:
上面的代码中,在主线程中new了一个非线程安全的ArrayList,然后开1000个线程分别向这个ArrayList里面添加元素,每个线程添加100个元素,等所有线程执行完成后,这个ArrayList的size应该是多少?应该是100000个?
然而实际运行结果可能不是100000!结果可能会是99946、99955...这就是非线程安全的集合在多线程操作的情况下导致不正确的结果。
具体线程安全这块可以参考我写的一篇博客:http://xxgblog.com/2013/05/16/java-threa...