线程不安全
线程最大的优点在于很多不同任务可以同时运行,并访问相同数据,而不同任务可以访问相同数据恰恰也是线程的缺点……
不像第一个程序,第二个程序的线程读取并修改了存储器中的共享数据:beers
变量。这有什么问题吗?好,我们来看一下当两个线程试图用以下代码减小beers
值时会发生什么:
- 首先,两个线程都需要读取当前beers变量的值。
- 接着每个线程都将数字减1。
- 最后每个线程都将beers-1这个值写回beers变量。
两个线程都想把beers
值减1,却没有成功。两个线程只把beers
值减去了1,而不是2,这就是为什么beers
变量没有减到0,因为线程之间会相互影响。
为什么结果是不可预测的呢?因为线程每次运行这行代码的顺序都不一样。线程有时不会撞车,有时则会撞得车毁人亡。
小心提防那些非线程安全的代码。
怎么才能知道一段代码是否线程安全呢?通常当两个线程读写相同变量时,代码就是非线程安全的。