多线程与高并发——基本概念
1. 何为进程?何为线程?
-
进程是程序的一次执行过程,是系统运行程序的基本单位,是动态的。
-
线程是一个比进程更小的执行单位(也叫轻量级进程)。一个进程在其执行的过程中可以产生多个线程。 之后可以扯JVM相关的内容,例如多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈
2. 并发与并行的概念
-
并发: 同一时间段,多个任务都在执行 (单位时间内不一定同时执行,即交替执行);
-
并行: 单位时间内,多个任务同时执行。
3. 创建线程的方式(Java)
- 继承Thread类
- 实现Runnable接口
- Callable和Future创建线程
- 线程池
4. 上下文切换
问多线程不一定很快的原因,可以回答这一点
如何减少上下文切换:1. 无锁并发编程 2. CAS算法 3. 使用最少线程 4. 协程
5.sleep(),join(),yield()
- sleep():即将当前线程休眠一段时间,并不会释放锁,但是会释放CPU资源(这是与wait的区别,sleep不会释放锁,当睡眠的时间到了之后,线程会自动进入可执行状态,等待cpu执行。而wait会释放锁,而且此时必须有另外线程执行notify或者notifyAll,才会唤醒执行了wait方法的线程,该线程才能等待cpu执行)
注意,sleep(),yield(),都是Thread的静态方法,用一个线程的实例去调用是没有意义的,因为这样是让执行该方法的线程进行睡眠或礼让。(join使用final修饰的)
-
yield():让出CPU资源,重新进行调度,之后还是执行yield()的线程也是有可能的,因为这是由CPU进行调度的,即我礼让一下,然后大家(包括我)再一起抢
-
join():意思就是在自己当前线程加入你调用Join的线程(),本线程等待。等调用的线程运行
完了,自己再去执行。t1和t2两个线程,在t1的某个点上调用了t2.join,它会跑到t2去运行,t1等待t2运
行完毕继续t1运行(自己join自己没有意义)
6. 线程的六种状态以及转化
——————————————————————————————————————————————————————
后面的不用掌握,瞄一眼有个印象即可
7. 避免死锁的几个常见方法
- 避免一个线程同时获取多个锁
- 避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源
- 尝试使用定时锁,使用lock.tryLock(timeout) 来替代使用内部锁机制
- 对于数据库锁,加锁和解锁必须在一个数据库连接里面,否则会出现解锁失败的情况
8. 如何解决资源限制的问题
- 对于硬件资源限制,使用集群并发执行程序
- 对于软件资源限制,使用资源池将资源复用