线程不安全的原因
我们知道,在系统中线程的执行机制是“抢占式”执行的过程,他就是导致我们线程不安全的“万恶之源”,但是呢,这样的执行机制是操作系统的内核自己实现的,程序猿无法干预,所以,这个问题属于环境问题。
对于环境问题,我们无法改变,只能学会适应。
一个例子明白线程不安全
对于系统中线程不安全的例子:
相信大家都有购买过火车票或者高铁票的经历:
小明和小红都想要明天下午西安-北京的高铁,但是通过购票软件查看票只剩下最后一张了,他们两人同时点进了购票界面,此时,如果两个人都完成了个人信息并且完成了购票,那么最后这张票的归属问题就成了一个麻烦。如果购票机制不作出修改的话,这样的问题就永远无法的到解决。
在上面的例子中,假设,小红先完成了购票操作,但是此时数据库还没有执行数据的更新操作,小明却也完成了购票,那么仅剩下的一张车票却被卖了两次,就导致了必定会有一个人没有票,从而产生不必要的麻烦。
解决线程不安全问题(原子性)
系统CPU中线程“抢占”导致的线程不安全问题,针对它我们也不是毫无解决的办法,此时就要介绍一个新的概念“原子性”.
“原子性”我们可以把一个人的购票行为想象成一个捆绑起来的一系列的行为,即,小红在进入购票界面时,就把这张车票临时封锁起来,这样小明就无法获取到这张车票的信息,在小明的视角中,车票已经是“售罄”的状态了。所以也就无法进入购票界面了。这样,就从根本上避免了二者之间的冲突。问题也得到了解决。
这样,就保证了线程的原子性。
有时候,我们也将遮掩打个操作称之为“同步互斥”,表示操作之间是相互排斥的。
总结
根据以上的例子我们可以大致得出以下结论:
1、线程的不安全问题主要是由于系统的“抢占式”执行机制导致的。
2、线程不安全问题可能发生于:一个线程在进行修改或者更新操作时,另一个线程却想要执行读操作,这样就导致无法确定读到的数据时修改前还是修改后,也就是所谓的线程的不安全。