1. 何为线程
是程序运行的基本执行单元,是进程中的实际运作单位,是轻量级的子进程;
2. 何为线程并发
程序启动多个线程并发执行;
3. 何为主线程
当jvm启动之后,加载类文件,发现main方法,就会为main方法创建一个线程,用于方法的执行,这个线程称之为主线程;
4. 何为线程安全和不安全
(1)当多个线程同时执行操作共享数据时,就有可能会产生不一样的数据结果,这就是所谓的线程不安全;
(2)当多线程和单线程同时执行程序,而最终的结果永远都是一样,这就是线程安全;
5. 何为多线程
为了更好利用cpu的资源,同时不阻塞线程的执行,程序可以开启多个线程一起执行其他任务,这就是多线程;
6. 何为线程池
频繁创建和销毁线程是非常消耗内存资源的,所以就衍生了线程池的概念,用于管理提前建好的多个线程,程序
需要的时候可以直接使用,提高线程的复用性和系统性能;
7. 何为线程的生命周期
(1)创建(实现线程);
(2)就绪(启动start);
(3)运行(运行run方法);
(4)等待/阻塞/睡眠(wait/join/sleep);
(5)终止(run方法stop或者其他异常终止);
8. 何为线程死锁
程序运行时多个线程同时阻塞,其中的一个或全部线程等待某个资源释放,而改资源又被其他线程锁定,从而导致每个线程都在等待其他线程释放资源,都无法结束,这就造成了线程的死锁;
9. 何为线程同步
- 为了解决线程不安全问题,需对线程进行同步,即多个线程只能对一个共享资源进行更改,不可对私有数据进行更改;
- 线程同步的几种方式:
(1)使用synchornized关键字修饰方法,添加同步锁;
(2)使用关键字volatile修饰共享变量实现伪同步;
(3)使用重入锁实现线程同步,即使用类ReentrantLock类来定义锁,其中lock()方法为打开锁,unlock()方法为关闭锁,注意及时释放锁,不然会进入死锁状态;
10. 线程的sleep、wait、join
(1)sleep和wait都会暂停线程,join则一般用于控制线程之间的先后顺序;
(2)sleep不会释放同步锁,而wait会释放同步锁;
11. 线程的start和run方法
(1)start()方法会启动新的线程,这时线程处于就绪状态,但还没开始运行,获取到cpu的时间片之后,就会开始执行run方法,这里的run方法称之为线程体,run运行结束,则线程终止;
(2)run方法属于thread类的一个普通方法的调用,在主线程里面执行,不会开启新线程;
(3)run方法包含在start方法里面;
12. 如何解决多线程中的高并发
线程高并发是多线程并发处理中必须会遇到的一个问题,这里分享一下博主的相关解决思路:
(1)高并发为何会产生问题?
当n个线程同时抢占共享资源数据的时候,如果不进行线程同步,则很难绝对保证线程安全问题,出现诸多问题,例如计算结果数据不一致、线程死锁、数据库死锁等
(2)高并发优化解决总体方案?
一方面是保证线程的同步性(限流);另一方面保证任务的执行效率(减压以及提高质量)
(3)优化细节?
同步性方面:synchornized、volatile、ReentrantLock等;
执行效率方面:
代码层:redis等缓存策略;线程池降低资源损耗;减少事务开启,合并事务单元等;
项目逻辑层:业务分块,减轻压力;分布式微服务项目部署;负载均衡策略等;
数据库层:数据集群;分库分表;读写分离策略;使用搜索引擎等优化工具等;