Java多线程高并发不知从何入手?我把我珍藏多年的宝藏分享出来了!
写在前面
现在很多人都觉的学习一门语言之后每天都在重复的进行CURD操作,根本用不到多线程高并发的知识,自己想学习,又不知道从何入手,因为多线程和高并发真的是很大的一个内容,这部分又是面试中面试官考察面试者能力的占比很重的一部分,这是初级程序员想改及程序员迈进必经的一个坎儿。
怎么学习?我把脑袋里的东西给你看!
脑图都给你了,你知道学习的思路了吗?
多线程和高并发从入门到精通
多线程和高并发大概讲六大块:
- 第一:基本概念,从什么是线程开始
- 第二:JUC同步工具,就是各种同步锁
- 第三:同步容器
- 第四:线程池
- 第五:高频面试加分项的一些面试用的东西,包括纤程。
- 第六:Disruptor,不知道有多少人听说过这个框架,这个框架他也是一MQ框架,叫做消息队列,消息队列非常多,著名的有kafka,RabbitMQ,Redis等这些都是消息队列。Disruptor是目前大家公认的在单机环境上效率最高的,性能最快的MQ。
你为什么要学习多线程和高并发?
原因是你想拿一个更高的薪水,在面试的时候呈现出两个方面的现象:
第一是上天:
- 项目经验
- 高并发、缓存、大流量、大数据量的架构设计
第二是入地:
- 各种基础算法,各种基础的数据结构
- JVM OS线程IO等内容
多线程和高并发就是入地的内容。
线程的基本概念
上面介绍的就是学习多线程和高并发的一个整体的思路,你可以参考我提供的思路去学习,从基础到高级,从表面到底层。
今天在这简单介绍一下线程和进程吧,不想在专栏里面专门写一篇博文介绍了,在这简单介绍一下,你看你是真的理解了吗,你真正理解了线程和进程是进阶的必备的。
什么叫进程?什么叫线程?
- 进程:做一个简单的解释,你的硬盘上有个简单的程序,这个程序是QQ.exe,这是一个程序,这个程序是个静态的概念,他被扔在硬盘上也没人理它,但是当你双击它,弹出登录的界面你登录进去了,这个时候叫做进程,进程相对于程序是一个动态的概念。
- 线程:做为一个进程里面最小的执行单元它就叫一个线程,用简单的话讲一个进程里面不同的执行路径就叫做线程。
面试题分享
请你告诉我启动线程的三种方式?
- newThread().start();
- new Thread(Runnable).start();
- Executors.newCachedThreadPool()或者FutureTask+Callable
认识几个线程的基本方法:
- sleep:就是睡眠,当前线程暂停一段时间让别的线程去运行,sleep怎么复活的?由睡眠时间而定,睡眠时间到了自动复活。
- yield:就是当前线程正在执行的时候停止运行进入等待队列,但是还是会被系统调度切换出来,他的意思就是让出cpu,但是其他线程能不能抢到它不会管。
- join:就是在自己当前的线程加入你调用Join的线程,本线程等待,等调用的线程运行完了,自己再去执行。t1和t2两个线程,在t1的某个点上调用了t2.join,他就会跑到t2去运行,等t2运行完毕再运行t1。
线程的状态
一个图看线程的六种状态:
线程状态的疑问
- 哪些是JVM管理的?哪些是操作系统管理的?
图中的状态全是JVM管理的,因为JVM管理的时候也要经过操作系统,所以哪个是JVM管理和操作系统管理分不开,JVM是跑在操作系统上的一个普通程序。
- 线程什么状态会被挂起?挂起是否也是一个状态?
Running的时候,在一个cpu上会跑很多的线程,cpu会隔一段时间执行这个线程一下,隔段时间执行那个线程一下,这是cpu内部的一个调度,把这个线程扔出去,从Running扔出去就叫做线程被挂起,cpu控制它。