线程不安全

线程最大的优点在于很多不同任务可以同时运行,并访问相同数据,而不同任务可以访问相同数据恰恰也是线程的缺点……

不像第一个程序,第二个程序的线程读取并修改了存储器中的共享数据:beers变量。这有什么问题吗?好,我们来看一下当两个线程试图用以下代码减小beers值时会发生什么:

线程不安全 - 图1

  • 首先,两个线程都需要读取当前beers变量的值。

线程不安全 - 图2

  • 接着每个线程都将数字减1。

线程不安全 - 图3

  • 最后每个线程都将beers-1这个值写回beers变量。

线程不安全 - 图4

两个线程都想把beers值减1,却没有成功。两个线程只把beers值减去了1,而不是2,这就是为什么beers变量没有减到0,因为线程之间会相互影响。

为什么结果是不可预测的呢?因为线程每次运行这行代码的顺序都不一样。线程有时不会撞车,有时则会撞得车毁人亡。

线程不安全 - 图5

小心提防那些非线程安全的代码。

怎么才能知道一段代码是否线程安全呢?通常当两个线程读写相同变量时,代码就是非线程安全的。