创作人QQ:851301776,邮箱:[lfr890207@163.com](mailto:lfr890207@163.com),欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点!

个人座右铭: 1.没有横空出世,只要厚积一定发。 2.你可以学历不高,你可以不上学,但你不能不学习。

一、概念

​    如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行某一段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值和预期的是一样的,就是线程安全的。

​    线程不安全,是多个线程在同时运行某一段代码的时候,并未提供保护,造成的并未达到预期的结果。

二、线程安全和不安全的本质原因

​        以count++举例说明:

 

​        

​    我们在的代码在执行的时候会被编译成汇编代码,然后变成二进制代码。上图中的代码(count++)是汇编的代码。汇编代码解析,主要分为三个步骤:

​    (1)CPU从内存中读取count的值到寄存器,并赋值给临时变量。

​    (2)CPU操作临时变量的值,进行+1操作。

​    (3)CPU吧临时变量的值写入count对应的内存。

 1.为什么会造成线程不安全?

​       如上图所举例:线程1读取了count的值,CPU切换到线程2,线程2,重新读取了count的值,然后进行操作并写入,此时线程1不重新读取,然后直接操作临时变量并写入。本来count的值相当于+2,但是实际上只是加了1.   

2.核心问题

​        多线程CPU切换造成的

3.解决方式

​    (1)加锁:互斥锁、尝试锁、自旋锁、读写锁(根据实际场景,所选用不同的锁)。

​    (2)原子操作

三、总结

​    我个人总结的是:

​    线程安全的:本质就是多线程对临界资源的操作,通过加锁等方式,能够达到预期效果。

​    线程不安全:本质就是多线程对临界资源不做保护,操作之后,无法达到预期的效果。

四、其他

​    线程安全和不安全,其实有一些特例的,比如无锁CAS等、包括try/catch等,所以需要灵活分析和使用。

Logo

更多推荐