java 面试知识点突击-(61-70)

Posted 栗子~~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 面试知识点突击-(61-70)相关的知识,希望对你有一定的参考价值。

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


java 知识点扫盲目录

https://blog.csdn.net/weixin_38316697/article/details/121991582

java 面试知识点突击-(61-70)

61 线程的生命周期,线程有几种状态?

生命周期:
1)创建-NEW
2)就绪-Runnable

该状态的线程位于可运行线程池中,等待获取CPU的执行权

3)运行-Running

就绪状态的线程获取CPU,执行程序代码。

4)阻塞-Blocked

等待阻塞:
执行Object中的wait(英:weit) 方法,进入这个状态后,不能自动唤醒,只能通过notify或notifyALL唤醒
同步阻塞:
同步锁,未获取到同步锁的线程,JVM会把它放在锁池中
其他阻塞:
Thread 类 sleep或者join。

5)死亡-Dead


62 sleep(),wait(),join()区别?

锁池:
凡是竞争同步锁失败的线程都会放在锁池中。
等待池:
等待池中的线程不会去竞争同步锁,只有调用notify或notifyAll后才会去竞争锁,放进锁池。

sleep():
Thread类的静态本地方法,
不会释放锁(因为不需要唤醒),
如何中断?
调用线程的interrupt,抛异常interruptException
一般用于当前线程
wait():
Object类中的方法,
需要释放锁,调用notify或notifyAll 将线程从等待池放进锁池去竞争
多线程之间的通信
join() :
让别的线程先执行。
例:在线程B中调用线程A的join方法,线程B阻塞,直到线程A结束或者中断线程。


63 说说对线程安全的理解?

线程安全主要体现在三个方面:
原子性
可见性
有序性
线程安全即内存安全,堆是共享内存,可以被所有线程访问。

线程安全主要考虑的是堆!!!
多个线程访问的对象和单个线程访问对象,最后的结果是一样的。
什么是内存泄漏?
堆在操作系统对进程初始化的时候分配,运行过程中也可以向系统要额外的堆,但用完了要还给系统,要不然就是内存泄漏。
栈是线程是线程安全的;
因为栈是每个线程独有的,所以栈中的变量是线程安全的。

栈的生命周期和线程一样,每个方法在执行的时候就会创建一个栈帧,它包含局部变量表、操作数栈、动态链接、方法出口等信息,局部变量表又包括基本数据类型和对象的引用。
注:当线程请求的栈深度超过了虚拟机允许的最大深度时,会抛出StackOverFlowError异常,方法递归调用肯可能会出现该问题;


64 Thread、Runable的区别?

Thread和Runable是继承关系,没有可比性,效果都是一样的,没有什么好用不好用之说,
对共享资源操作都是一样的。
使用上区别:

  • 如果有复杂的线程操作就用Thread,如果是简单的执行一个任务使用Runable;
  • api上,Threa比Runable更加丰富;

65 谈谈对守护线程的理解?

java中有两种线程,一种叫守护线程,一种叫用户线程
守护线程,为所有非守护线程提供服务的线程。
注:任何一个守护线程都是整个JVM中所有用户线程的保姆。
守护线程的作用:
例:GC的垃圾回收线程。
守护线程的用法:
在thread.start之前调用thread.setDaemon(true)
否则的话会爆异常,不能再正在运行的线程设置为守护线程。
注:java自带的线程池不能设置为守护线程,因为会将你设置的守护线程转为用户线程。


66 说说你对Threadlocal的理解?

每一个Thread对象都含有一个私有ThreadlocalMap类型的成员变量Threadlocals,Threadlocals是Threadlocal的一个内部类。
它存储本线程中所有的ThreadLocal对象及其对应的值。
ThreadlocalMap由一个一个Entry对象组成.
注:Entry的key是Threadlocal对象,是一个弱引用,即当没指向key的强引用后,该key就会被垃圾收集器回收。

原理:

set:
Threadlocal会获取当前线程对象,取出当前线程对象的ThreadlocalMap,然后在以当前线程对象为Threadlocal对象为key,存值。
get:
Threadlocal会获取当前线程对象,取出当前线程对象的ThreadlocalMap,然后在以当前线程对象为
为Threadlocal对象为key,取值。

注:因为每一个线程都有一个私有的ThreadlocalMap容器,他们之间相互独立,因此不存在线程安全问题。
使用场景:

1、对象跨层传递时,比如(controller->server-dao),使用Threadlocal打破层级约束。
2、线程间数据隔离,因为只有当前线程能够操作到,并且是每个线程私有的。
3、spring的事务操作,即当事务开启时,会给当前线程绑定一个jabc connection,并在整个事务过程中使用该connection,就是采用的Threadlocal,实现了事务隔离。


67 Threadlocal内存泄漏原因?

辅助知识:

内存泄漏:因为各种原因,不使用的对象所占用的内存不能被回收。
内存溢出OOM:内存不够,申请内存没有内存可分配。

强引用: new 关键字,反射创建等,强引用不会被垃圾回收,即使内存不足,虚拟机会抛出OOM,使得程序终止,也不会回收
如何取消强引用:可以显示将某个对象赋值为null,JVM会在合适的时间给它回收。
弱引用:JVM垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。
在java中用java.lang.ref.WeakReference类来表示。
弱引用举例:ThreadlocalMap(英:c 瑞 d+漏扣+Map)的key。
软引用:软引用一般被做为缓存来使用。与强引用的区别是,软引用在垃圾回收时,虚拟机会根据当前系统的剩余内存来决定是否对软引用进行回收。如果剩余内存比较紧张,则虚拟机会回收软引用所引用的空间;如果剩余内存相对富裕,则不会进行回收。换句话说,虚拟机在发生OutOfMemory时,肯定是没有软引用存在的。

内存泄漏的出现原因:
JVM里强引用消失,ThreadlocalMap的key因为为弱引用,所以为null,如果当线程一直存在时,弱引用那个null就不会回收。
内存泄漏的根源就在于ThreadlocalMap的生命周期和Thread一样长,如果没有手动删除对应key,就会导致内存溢出。

Threadlocal的正确使用:
1)每次使用完Threadlocal都调用它的remove()方法清除数据;
2 )将Threadlocal变量定义为private static,这样的话一直存在Threadlocal的强引用,也就能保证任何时候都能通过Threadlocal的弱引用访问到Entry的value值,进而被删除


68 springBoot 、spring MVC 、spring有什么区别?

spring 是一个IOC容器 管理bean,使用依赖注入控制反转,可以很方便的整合各种框架,提供AOP机制,弥补OOP代码重复的问题,面向切面编程。

spring MVCspring 对WEB框架的一个解决方案,一个轻量级框架,由一个总前端控制器servlet,用来接受请求,并定义了一套路由策略(url到处理器(handle)的映射),以及一系列适配器,来执行处理器(handle),将处理器的结果解析成视图展示给前端。

springBoot 快速开发工具包,底层也是spring + spring MVC ,只是简化了配置(约定了默认配置),并整合了一系列解决方案(redis、es…),可以直接开箱即用,最大的区别是使用的区别,更加效率,简洁


69 spring MVC 工作流程?

	1.  用户发送请求到【前端控制器】;
	2. 【前端控制器】收到请求调用【处理器映射器】;
	3. 【处理器映射器】找到该配置,生成【处理器】和【处理器拦截器】(如果有则生成)返回给【前端控制器】;
	4. 【前端控制器】调用【处理器适配器】;
	5. 【处理器适配器】经过适配调用具体的【controller】(业务逻辑);
	6. 【controller】返回ModelAndView;
	7. 【处理器适配器】拿到ModelAndView后传给【前端控制器】;
	8. 【前端控制器】将ModelAndView传给【视图解析器】;
	9. 【视图解析器】解析返回具体的view;
	10. 【前端控制器】根据view渲染视图返回给用户;

70 spring MVC 常用组件?

这是最重要的是这两个核心组件
1. 【处理器映射器】-HandlerMapping 就是维护一个url与【处理器】Handler的映射关系。
2.【适配器】-HandlerAdapter【处理器】Handler是用来干活的工具,【处理器映射器】根据干的活找到相应的工具,【适配器】使用工具干活的人。

其他的对我来说了解不了解意义不大。


创作不易、点关注、不迷路

点击主页、更精彩 !!!

以上是关于java 面试知识点突击-(61-70)的主要内容,如果未能解决你的问题,请参考以下文章

java 面试知识点突击-(71-80)

java 面试知识点突击-(51-60)

java 面试知识点突击-(81-90)

java 面试知识点突击-(91-100)

Java面试手册V2.0+突击V3.0知识点整理(二十) 附封面图片

负载均衡(纯手写,极度适合巩固基础面试突击)