更多技术干货,重视公众号:Hoeller
Java中有哪几种办法来创立线程执行任务?
Java 中有两种创立线程的办法:
- 完成 java.lang.Runnable 接口,并重写 run() 办法
- 继承 java.lang.Thread 类,并重写 run() 办法
为什么不主张运用Executors来创立线程池?
通常不主张运用Executors创立线程池,由于它们不允许您对线程池进行很好的操控和调整。Executors供给了一些预定义的线程池,但它们不能满意一切运用程序的需求。例如,您不能设置核心线程数,最大线程数,以及怎么处理超出线程池巨细的任务。因此,假如您需求对线程池进行更多的操控,主张运用ThreadPoolExecutor类来创立线程池。
Sychronized和ReentrantLock有哪些不同点?
- 完成办法: Synchronized 是 Java 中的关键字,而 ReentrantLock 是 Java 中的一个类。
- 可重入性: Synchronized 默认是可重入的,但是 ReentrantLock 显式的支持可重入。
- 显现性:Synchronized 是隐式锁,代码完成时不需求显现调用,而 ReentrantLock 是显现锁,需求显现的调用 lock() 和 unlock() 办法。
- 可中止性: Synchronized 是不可中止的,除非抛出反常,而 ReentrantLock 能够经过 lockInterruptibly() 办法完成可中止。
- 确认拥有者:Synchronized 不能知道锁的拥有者,而 ReentrantLock 能够经过 isHeldByCurrentThread() 办法查询当时锁是否被当时线程持有。
- 公正性:Synchronized 默认对错公正锁,ReentrantLock 能够经过结构函数指定是否为公正锁。
Sychronized的锁晋级进程是怎样的?
Synchronized 锁晋级是指从倾向锁晋级为轻量级锁,再晋级为重量级锁的进程。具体如下:
- 倾向锁:在单线程情况下,Java 的倾向锁机制能够减少加锁的开支,进步程序的功率。
- 轻量级锁:当倾向锁的目标被其他线程竞争时,JVM 就会晋级锁的状况为轻量级锁。
- 重量级锁:假如多个线程一起竞争一个轻量级锁,JVM 就会将锁晋级为重量级锁,重量级锁是经过操作体系的 Mutex 互斥锁来完成的。
经过晋级锁的状况,Synchronized 锁能够在确保线程安全的一起,进步程序的功率。
Spring中Bean的生命周期是什么
Spring 中 Bean 的生命周期指的是从 Bean 创立到 Bean 毁掉的整个进程。Spring Bean 生命周期包括以下几个阶段:
- Bean 实例化:经过默认结构函数或工厂办法创立 Bean 实例。
- Bean 特点设置:为 Bean 的特点设置合适的值。
- 完成 BeanPostProcessor 接口的 Bean 初始化:当容器初始化时,会调用 BeanPostProcessor 的 postProcessBeforeInitialization() 办法,在该办法中能够对 Bean 进行额定的初始化。
- 调用 Bean 的 init() 办法:假如 Bean 完成了 InitializingBean 接口,那么容器会自动调用该 Bean 的 init() 办法进行初始化。
- 完成 BeanPostProcessor 接口的 Bean 初始化:在容器初始化 Bean 后,会调用 BeanPostProcessor 的 postProcessAfterInitialization() 办法,在该办法中能够对 Bean 进行额定的初始化。
- Bean 在容器中的运用:在容器中经过 Bean 的引用调用 Bean 的办法。
- Bean 毁掉:当容器封闭时,容器会自动调用 Bean 的毁掉办法,毁掉 Bean。
Tomcat为什么要自定义类加载器?
Tomcat 中运用自定义类加载器的原因有以下几点:
- 独立布置:Tomcat 的自定义类加载器能够让不同的 Web 运用阻隔,然后避免类抵触问题。
- 动态布置:Tomcat 的自定义类加载器能够完成动态加载和卸载 Web 运用,然后完成灵活的布置和办理。
- 高效加载:Tomcat 的自定义类加载器能够从已有的缓存中加载类,然后大大进步加载功率。
- 权限操控:Tomcat 的自定义类加载器能够操控 Web 运用对体系资源的访问,然后进步体系的安全性。
总的来说,Tomcat 中运用自定义类加载器能够进步 Web 运用的安全性和功率,供给了更好的灵活性和办理能力。
运用呈现OOM,该怎么排查?
假如运用呈现了 OOM (Out Of Memory) 过错,你能够运用以下过程来排查问题:
- 剖析过错日志:OOM 过错日志中会包括具体的过错信息,如仓库信息、内存运用情况等,从中能够大致判断出是哪一部分的内存运用过多。
- 查看内存装备:查看运用的内存装备,确保最大内存约束和初始内存巨细设置恰当。
- 剖析内存运用情况:运用东西(如 JVisualVM)来剖析内存运用情况,确认内存泄露的部分。
- 查看代码:查看代码是否有内存泄露的问题,如未正确释放不再运用的目标等。
- 运用内存剖析东西:运用内存剖析东西(如 MAT)来确认哪些目标占用了很多内存,然后确认内存泄露的原因。
经过以上过程,能够找出导致 OOM 过错的原因,并采取相应措施进行修正。
大家觉得Chat-GPT回答的怎么样?有没有BUG?