线程常见面试题
- 1.线程和进程有什么区别?
- 2.并行和并发有什么区别
- 3.线程创建4种方式?
- 4.线程有哪些状态
- 5.为什么要使用线程池?
- 6.线程池的构造方法里几个参数的作用分别都是什么?
- 7.线程池流程
- 8.线程池拒绝策略有哪些
- 9.notify()和 notifyAll()有什么区别?
- 10.wait()和sleep()的区别
- 11.volatile能否保证线程安全
- 12.lock锁和synchronized锁区别
- 13.乐观锁和悲观锁的区别
- 14.什么是cas
- 15.HashTable的默认初始容量是多少,扩容因子是多少?每次扩容多少?
- 16.HashTable在计算索引的时候,为什么不进行二次hash
- 17.ConcurrentHashMap的initcapacity和loadFactor与HashMap的含义相同吗?
- .ConcurrentHashMap相关问题?
- 18.1.7和1.8的区别
- 19. get方法需要加锁吗?
- 20. 迭代的时候采用的是强一致性还是最终一致性
- 21. 1.7和1.8的并发度
- 22. ConcurrentHashMap相比Hashtable的并发度
- ThreadLocal
- 23. 谈谈您对ThreadLocal的理解
- 24. ThreadLocal的原理
- 25. ThreadLocalMap扩容机制
1.线程和进程有什么区别?
进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程,但一个进程一般有多个线程。
进程在运行过程中,需要拥有独立的内存单元,否则如果申请不到,就会挂起。而多个线程能共享内存资源,这样就能降低运行的门槛,从而效率更高。
线程是是cpu调度和分派的基本单位,在实际开发过程中,一般是考虑多线程并发。
2.并行和并发有什么区别
并行:多个任务在计算机中同时执行
并发:多个任务在计算机中交替执行
举例:吃馒头
3.线程创建4种方式?
4.线程有哪些状态
站在JavaAPI的角度:
1.新建(NEW)
new Thread()
2.可运行状态(RUNABLE)
调用start方法
3.终结状态
run方法中代码执行完毕
新建—>可运行—>终结是不可逆
4.阻塞状态
没有获取锁的线程
当获取锁的线程释放掉锁,重新抢占锁成功—>可运行状态
5.等待状态
获取锁的线程,调用锁对象.wait方法
当其他线程调用锁对象.notify方法唤醒等待状态的线程,重新获取锁成功----->可运行状态
6.有时限的等待
获取锁的线程,调用锁对象.wait(long)方法
当其他线程调用锁对象.notify方法唤醒等待状态的线程,重新获取锁成功----->可运行状态
时间到了重新获取锁成功----->可运行状态
调用线程的sleep(long)方法
时间到了----->可运行状态
5.为什么要使用线程池?
第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程
池可以进行统一的分配,调优和监控。
6.线程池的构造方法里几个参数的作用分别都是什么?
ThreadPoolExecutor构造方法中的七个参数:
corePoolSize 核心线程数目 - 池中会保留的最多线程数
maximumPoolSize 最大线程数目 - 核心线程+救急线程的最大数目
keepAliveTime 生存时间 - 救急线程的生存时间,生存时间内没有新任务,此线程资源会释放
unit 时间单位 - 救急线程的生存时间单位,如秒、毫秒等
work