上回我们讲到了高并发的实现,这次就来说说高并发的原理吧,希望对你们深入了解高并发有所帮助。
首先我们需要了解,什么是并发?什么又是并行?
什么是并发?
并发就是在一个时间点内发生多个相同的事件,这就是并发。例如这次疫情期间开学大家都在同一时间点抢票,对于服务器来说,这就是并发。
什么是并行?
在同一时间点多个服务器发生的事件就是并行。如上面所说:开学期间,大家都在抢票,你也在抢票,对于你和另外的人来说,这就是并行。
并发和并行概念很容易混淆,需要多加注意。
高并发编程的核心思想是什么?
保证程序运行时关键数据在多线程中的可见性、核心业务的原子性、多线程通信的有序性。
多线程中的可见性问题是什么?
线程是由CPU创建的,CPU在创建时会将堆内存中部分对象缓存至自己的缓存区中,如果当前线程运行期间如果有其它线程操作了该对象,数据不一致了就会导致程序出现问题。
如何解决可见性问题?
1).使对象不能被CPU缓存:使用volatile、synchronized关键字
2).使对象无法被修改:枚举enum、全局不可变量final、手动编写一个不可被改变的对象
原子性问题是什么?
什么是原子性?就是逻辑上不可被拆分的操作
为什么会有原子性问题?线程与线程之间是不可见的,同一任务在多个线程中并行的被执行,最终得到执行结果,这是多线程的优势也由此产生了原子性问题。
如何解决原子性问题?
外部对象上赋予多线程原子性:用synchronized关键字、Lock相关类在执行核心业务时通过使用锁定对象的方式变相将多线程暂时变为单线程。
多线程通信间的有序性问题是什么?
有序性:若A事件发生是B事件发生的充分条件,那么我们称先发生A事件再发生B事件为有序,反之无序。
为何会产生有序性问题:线程与线程之间是不可见,并行的,也就是说B事件发生过程中无法确认A事件是否发生。
如何解决有序性问题?
在线程间协作,使事件B在A发生前阻塞等待,在事件A发生后唤醒事件B。
如何处理高并发问题?
a提高单机服务器配置
b增加服务器数量
c应用层利用缓存减少IO次数,提高并发访问处理速度
以上就是本文的所有内容了,更多java常见问答知识请关注我们的网站了解吧。
推荐阅读: