有关线程的面试题总结

多线程:
1.进程和线程的区别
问:线程有自己独立的变量吗?
答:同一个进程中的多个线程之间可以并发执行,他们共享进程资源。线程不拥有资源,线程可以访问隶属进程的资源。进程有自己的独立空间地址,线程没有自己的独立空间地址,但是线程有自己的堆栈和局部变量
问:为什么线程不拥有独立的地址空间但却可以有私有的栈,程序计数器等?
答:这些本来也是存放在进程的地址空间上,只是这些都只能有某个特定的线程去访问,其他的线程访问不到。

2.让三个子线程执行完,再执行主线程有哪些方法
答:(1)CountDownLatch类:调用await()方法,让主线程等待多个线程执行完后再执行
(2)join方法
在调用start方法后直接调用join方法,则三个线程将串行执行
(3)Callable接口和FutureTask类
使用Callable,需要Future Task,用于接收运算结果。接收所有运算后主线程才执行。

3.如何保证线程安全性
volatile是如何保证可见性的?
答:因为编译之后代码都会被编译成字节码文件,JVM会将.class转换为具体的CPU执行指令。当内核运行的线程执行一段代码时,首先将这段代码的指令集缓存的高速缓存区,若此变量没有加volatile关键字,当修改了此变量后会立即将值写回高速缓存区,然后刷新到内存中,那么如果此时是共享变量,则另一个线程执行的代码也用到了这个变量,这个变量还是原来的旧值
若加了volatile关键字,被volatile修饰的共享变量在转换成汇编语言时,会加上一个以lock为前缀的指令,当CPU发现这个指令时,就会:将当前内核高速缓存行的数据立刻写回到内存;使在其他内核里缓存了该内存地址的数据无效。

4.线程池有哪几种?分别适用的场景?线程池的工作流程?
创建一个线程池涉及到的参数 ?阻塞队列有哪几种以及他们适用的场景?

5.死锁产生的条件?
有四个
如何预防死锁?
Lock的方法,破坏条件,三个
如何解决死锁?
银行家算法

6.内存区域的划分?
程序计数器是私有的,如果当前线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令地址。
如果正在执行的是一个native方法,这个计数器为空,为什么?
答:当线程中调用native方法的时候,则重新启动一个新的线程,那么新的线程的计数器为空则不会影响当前线程的计数器,他们是相互独立的。

7.解释内存溢出和内存泄漏?
内存溢出如何定位?
涉及到内存映射文件.hprof,参数,jmap,MATI工具等。
引起内存溢出的原因?
内存溢出的解决方案?
静态内部类和非静态内部类哪个可能导致内存泄漏?
答:非静态内部类
为什么?
因为它会持有外部内的引用。

8.新生代和老年代
判断对象是否存活的算法?
垃圾回收的算法?
有哪些引用?具体说一说?
复制算法和标记整理的优缺点?

9.MinorGC的触发条件?
答:当Eden区满时,就会触发一次Minor GC
Full GC的触发条件?
(1)调用System.gc()
(2)老年代空间不足
(3)空间分配担保失败
(4)JDK1.7及以前的永久代空间不足
这些点要进行详细的说明。

10.synchronized的底层实现?
monitor机制
synchronized和lock的区别?

11.缓存一致性问题
12.JVM内存优化
内存抖动;大页内存
需要详细解释

13.如何解决高并发问题?
(1)HTML静态化
(2)图片服务器分离
(3)数据库集群和库表散列
(4)缓存
(5)负载均衡
需要详细解释
14.为了保证线程安全,一般会对其进行加锁,但是加锁会影响并发性能,如何设计锁?
减少锁持有时间;减小锁粒度;用读写分离锁代替独占锁;锁粗化;锁分离;JVM优化锁:偏向锁,轻量级锁,自旋锁,锁消除等。

15.进程之间如何通信?
说说调度算法?

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值