Java 面试常问问题及答案总结

1、什么是线程池?

现有问题:
如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。

那么有没有一种办法使得线程可以复用,即执行完一个任务,并不被销毁,而是可以继续执行其他的任务?

思路: 提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁、实现重复利用。类似生活中的公共交通工具。
在这里插入图片描述
好处:

提高响应速度(减少了创建新线程的时间)

降低资源消耗(重复利用线程池中线程,不需要每次都创建)

便于线程管理


2、线程池的内部实现原理

Java 线程池的工作原理
全面解读Java线程池的工作原理
Java线程池实现原理

Java的线程池为什么要用阻塞队列呢?

阻塞队列主要是用于生产者-消费者模型的情况。比如一个线程从一个空的阻塞队列中取元素,此时线程会被阻塞直到阻塞队列中有了元素。当队列中有元素后,被阻塞的线程会自动被唤醒(不需要我们编写代码去唤醒)。 这样提供了极大的方便性。如果使用非阻塞队列,它不会对当前线程产生阻塞,就必须额外地实现同步策略以及线程间唤醒策略,这个实现起来就非常麻烦。


3、什么是单例设计模式?

设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式免去我们自己再思考和摸索。就像是经典的棋谱,不同的棋局,我们用不同的棋谱。“套路”

经典的设计模式共有 23 种。 每个设计模式均是特定环境下特定问题的处理方法。
在这里插入图片描述
简单工厂模式并不是 23 中经典模式的一种,是其中工厂方法模式的简化版 。

所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。

实现思路

如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造器的访问权限设置为 private,这样,就不能用 new 操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对象。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。

两种实现方式

饿汉式

class Singleton {
    
    
	 // 1.私有化构造器
	 private Singleton() {
    
    
	 }
	 // 2.内部提供一个当前类的实例
	 // 4.此实例也必须静态化
	 private static Singleton single = new Singleton();
	 
	 // 3.提供公共的静态的方法,返回当前类的对象
	 public static Singleton getInstance() {
    
    
	 	return single;
	 }
}

懒汉式

class Singleton {
    
    
	 // 1.私有化构造器
	 private Singleton() {
    
    
	 }
	 // 2.内部提供一个当前类的实例
	 // 4.此实例也必须静态化
	 private static Singleton single;
	 // 3.提供公共的静态的方法,返回当前类的对象
	 public static Singleton getInstance() {
    
    
	 	if(single == null) {
    
    
	 		single = new Singleton();
	 	}
	 	return single;
	 }
}

饿汉式 vs 懒汉式

在这里插入图片描述

单例模式的优点及应用场景

由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。

应用场景

  • Windows 的 Task Manager (任务管理器) 就是很典型的单例模式
  • Windows 的 Recycle Bin (回收站) 也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。
  • Application 也是单例的典型应用
  • 应用程序的日志应用,一般都使用单例模式实现,这一般是由于共享的日志文件一直 处于打开状态,因为只能有一个实例去操作,否则内容不好追加。
  • 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。

4、线程有哪几种状态?

线程的几种状态

猜你喜欢

转载自blog.csdn.net/weixin_44123362/article/details/130257264