看完这篇文章,再也不惧面试官问到多线程

本人目前还未毕业,也没有接触过多线程的项目,所以有不对的地方还请见谅(轻喷)
线程的一些基本概念就不写了,像线程和进程的区别,线程的状态啥的可以去看看别的文章

说到多线程那就少不了并发,一般面试官会问“说说你对多线程的理解”或者是对线程安全的了解啥的

1. 多线程到底是什么?

想要了解多线程就要知道底层原理是什么。首先多线程不是某种语言具有的,而是操作系统的,可以理解为程序的多线程都是调用了操作系统来实现的。操作系统也是依赖于计算机本身的硬件,我们知道多线程的原理是把cpu的执行时间划分成很多小片段,但是这样会有一个问题,不同线程之间切换会造成cpu的性能损耗(就像你一会写作业一会玩手机来回切换效率也不会高一样)。一个好消息是现在的计算机基本不是单核的
在这里插入图片描述
可以看到笔者的计算机有四个逻辑处理器(逻辑处理器和内核关系可以百度一下),什么意思呢。简单来说就是一个逻辑处理器在一个时间只能处理一个线程,四个逻辑处理器就可以同时处理四个线程。当系统中只有四个线程在运行的时候就不会出现线程切换的问题,所以线程池的线程数量设置一般都和物理核心数有关。
看到这里以后就不要傻傻地说单线程效率一定比多线程低,当然现在单核处理器已经很少了,服务器一般都是几十到上百个核心甚至会有多cpu

2.线程安全

线程安全具体是什么我就不多写了。我把线程安全分为两大类:1.需要共享数据 2.不需要共享数据

2.1.需要共享数据

这种比较常见,比如统计访问次数的累加操作,还有库存数量的问题。这些有一个共同点就是不同线程要对同一个变量操作导致出现了脏数据。
解决方法也很简单,简单粗暴点直接用synchronized关键字修饰方法,同一时间只让一个线程操作这个共享变量。
这里重点讲一下volatile关键字,首先volatile不能保证线程安全,volatile的作用是禁止指令重排和内存可见,但是他不能保证原子性。说到volatile就要了解一下cpu和内存之间的关系,cpu和内存之间其实并不是直接交互数据的,内存的速度虽然很快但是还是跟不上cpu的速度,所以一般在内存和cpu之间还会有几个高速缓存区,我们买电脑的时候经常可以看到宣传的1级2级缓存多大,这个缓存就是高速缓存区。线程在cpu中运行,一般会把内存中的数据读取到高速缓存区,假设A,B线程同时读取到了变量t到各自的缓存区,当A线程改变了t的值的时候,B线程的高速缓存区的t还是原来的,就会有线程安全的问题。volatile的作用是,当A线程改变t的值的时候,会导致B线程的高速缓存区的t失效,这就是内存可见性。
有些人不明白既然有内存可见性的作用为什么不能保证线程安全?假设A,B线程都是对t变量进行++操作,A,B线程同时把t变量读取到各自的高速缓冲区,A线程对t的操作是同一个零时变量记录t+1的值,然后存放在寄存器中,这个时候并没有真正改变t的值,所以B线程中的缓存不会失效,这就是volatile不能保证线程安全的真正原因。但是可以配合cas来保证线程的安全,不过cas也有一些问题可以自行百度。

2.2.不需要共享数据

假设在一个controller中有一个类成员变量user存储了用户信息,每个线程的user数据应该是不一样的,A线程设置的user对象不应该影响B线程。这个时候可以用到ThreadLocal,具体作用可以百度,它和事务有异曲同工之妙。

以上内容都是我看一些百度软文总结的,真正源码我目前还没有能力可以看懂,所以很多都是自己猜测的,有不对的地方还请在评论区留言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值