--------------------------------------------------------------------------------------------------------------------------------------------------------线程安全举个例子吧 比如说,现在有一篮子苹果,有大有小,然后有一群人要来拿苹果了在线程非安全情况下: 所有人一哄而上,变成了抢苹果了,因为大家都想要大的苹果,会发生冲突的在线程安全情况下: 把这一篮子苹果放到一个小屋里面,然后锁起来,然后每次只让一个人进去拿,等那个人拿完然后再让下一个人进去拿,这样保证了每个人都能拿到苹果,而且不会出现冲突。
线程安全 一段代码,同时几个线程同时使用,结果都是正确的,就叫线程安全。 比如我们打开百度知道的首页,全世界很多人都在打开,都是正确的,证明百度知道首页的那段代码是线程安全的
------------------------------
------------------------------
------------------------------
------------------------------------------------------------
--
线程安全比如一个 ArrayList 类,在添加一个元素的时候,它可能会有两步来完成:1. 在 Items[Size] 的位置存放此元素;2. 增大 Size 的值。
在
单线程运行的情况下,如果 Size = 0,添加一个元素后,此元素在位置 0,而且 Size=1;
而如果是在
多线程情况下,比如有两个线程,线程 A 先将元素1存放在位置 0。但是此时 CPU 调度线程A暂停,线程 B 得到运行的机会。线程B向此 ArrayList 添加元素2,因为此时 Size 仍然等于 0 (注意,我们假设的是添加一个元素是要两个步骤,而线程A仅仅完成了步骤1),所以线程B也将元素存放在位置0。然后线程A和线程B都继续运行,都增加 Size 的值,结果Size都等于1。
那好,我们来看看 ArrayList 的情况,期望的元素应该有2个,而 实际元素是在0位置,造成丢失元素,故Size 等于 1。这就是“线程不安全”了。