线程不安全的五个原因

前言
多线程比起多进程更轻量,可以更高校的完成并发编程。多线程是访问同一个资源的,但是是抢占式执行的过程,而执行的先后由操作系统的调度器决定。当多个线程对同一个资源值进行读的时候,不会有线程安全问题,而进行写的时候,会出现线程安全问题。
线程操作过程中出现不安全性的原因,操作过程可以分为三步:1.首先,把内存的数据读取到CPU寄存器中;2.其次对寄存器中的内容进行指令操作比如ADD等,将操作结果继续放在寄存器中(但是由于线程抢占式执行的特性,可能指令操作过程中,就被调度出CPU,继续由第二个线程执行);3.把寄存器中的数据写入到内存中。

1.线程的抢占式执行

具有随机性,由操作系统内核实现

2.多个线程修改同一个变量

需求所要求的

3.线程的非原子性操作

线程主要有三个操作:从内存中读取内容到寄存器中,通过指令对数据进行操作并写入寄存器中,从寄存器中写入内存。
当线程操作过程中的三个操作被打包成一个整体,禁止线程互相穿插执行,就可以保证线程安全。

4.内存可见性

当两个线程同时操作一个内存,例如一个读一个写,但是当写操作的线程进行的修改的时候,读线程可能读到修改前的数据,也可能读到修改后的数据,这是不确定的。
内存可见性的本质是编译器优化导致了线程1修改的数据没有及时的写入到内存中,线程2就读取不到最新的数据。
解决可见性问题的关键在于,禁止编译器优化,要等前一个线程执行完毕再开始后一个线程的操作,这样虽然慢,但是准确率高。

5.指令重排序

和 线程不安全、编译器优化 直接相关。
为了提高程序的执行效率,调整了执行的顺序(调整的目的是为了提高效率,不改变逻辑)
编译器也会自动对顺序进行调整。单线程下调整不会出现问题,多线程下调整会出现大问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值