多线程安全问题

线程不安全的原因

  我们知道,在系统中线程的执行机制是“抢占式”执行的过程,他就是导致我们线程不安全的“万恶之源”,但是呢,这样的执行机制是操作系统的内核自己实现的,程序猿无法干预,所以,这个问题属于环境问题。
对于环境问题,我们无法改变,只能学会适应。

一个例子明白线程不安全

  对于系统中线程不安全的例子:
相信大家都有购买过火车票或者高铁票的经历:
  小明和小红都想要明天下午西安-北京的高铁,但是通过购票软件查看票只剩下最后一张了,他们两人同时点进了购票界面,此时,如果两个人都完成了个人信息并且完成了购票,那么最后这张票的归属问题就成了一个麻烦。如果购票机制不作出修改的话,这样的问题就永远无法的到解决。
在这里插入图片描述
  在上面的例子中,假设,小红先完成了购票操作,但是此时数据库还没有执行数据的更新操作,小明却也完成了购票,那么仅剩下的一张车票却被卖了两次,就导致了必定会有一个人没有票,从而产生不必要的麻烦。

解决线程不安全问题(原子性)

  系统CPU中线程“抢占”导致的线程不安全问题,针对它我们也不是毫无解决的办法,此时就要介绍一个新的概念“原子性”.
  “原子性”我们可以把一个人的购票行为想象成一个捆绑起来的一系列的行为,即,小红在进入购票界面时,就把这张车票临时封锁起来,这样小明就无法获取到这张车票的信息,在小明的视角中,车票已经是“售罄”的状态了。所以也就无法进入购票界面了。这样,就从根本上避免了二者之间的冲突。问题也得到了解决。
  这样,就保证了线程的原子性。
  有时候,我们也将遮掩打个操作称之为“同步互斥”,表示操作之间是相互排斥的。

总结

  根据以上的例子我们可以大致得出以下结论:
1、线程的不安全问题主要是由于系统的“抢占式”执行机制导致的。
2、线程不安全问题可能发生于:一个线程在进行修改或者更新操作时,另一个线程却想要执行读操作,这样就导致无法确定读到的数据时修改前还是修改后,也就是所谓的线程的不安全。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值