什么是线程安全?
其实线程安全指的也就是内存安全,操作系统里面会有很多进程,为了保证安全,操作系统会为这些进程分配各自的内存,每个进程就只能访问自己的那部分内存,而这个内存就叫堆内存。但每个进程里面可能又有许多的线程,为了安全也会为它们分配一个自己的内存,这个内存就叫栈内存。
而现实场景中不可能每个线程都只访问栈内存,有部分变量就需要放到一个公共空间里面,但如何保证这个公共空间资源的安全呢?
解决方案以下几种,
- 局部变量
直接放到每个线程的栈内存中
- 就是资源复制多几份给每个线程都能分到一份一样的资源,
其实也就是ThreadLocal类。从逻辑上讲应该好像是在栈内存里面,但这些一样的资源其实还是在堆内存里面。
- 把这个资源设置为只能看,不能摸:
其实就是常量或只读变量,不能修改,那么这个资源肯定会是安全的
-
使用互斥锁
-
使用CAS(会存在ABA问题)
因为锁的获取和释放是要花费一定代价的,如果在线程数目特别少的时候,可能根本就不会有别的线程来操作数据,此时你还要获取锁和释放锁,可以说是一种浪费,所以就可以使用CAS提高性能
总结
前两种属于隔离法,一个是位置隔离,一个是数据隔离。
然后两种是标记法,一个是只读标记,一个是加锁标记。
最后一种是大胆法,先来怼一把试试,若不行从头再来。
参考:https://mp.weixin.qq.com/s?__biz=MzAwNDA2OTM1Ng==&mid=2453140919&idx=1&sn=33c1d972afd3476cd78971b372d59d56&scene=21#wechat_redirect