最近自己参加了深圳某公司的面试,将面试官提出的问题以及自己的理解贴出来,便于日后学习、巩固知识。
问题一:了解单例模式吗?讲讲它的实现方法?
回答:
单例模式是Java设计模式的一种,谈及设计模式,它是程序员在软件开发过程中,为了解决一些问题而提出的最佳解决方案,主要分为
1)创建型模式
单例模式、原型模式、工厂方法模式、抽象工厂模式、建造者模式
2)结构型模式
代理模式、适配器模式、桥接模式、装饰模式、外观模式、享元模式、组合模式
3)行为型模式
模板方法模式、策略模式、命令模式、职责链模式、状态模式、观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式、解释器模式
其中单例模式可以分为五种实现方法
方式一:饿汉式
//饿汉式第一种:静态变量
class Singleton {
//构造器私有化
private Singleton() {
}
//类的内部创建静态常量对象实例
private final static Singleton instance = new Singleton();
//对外部提供获取对象实例的方法
public static Singleton getInstance() {
return instance;
}
}
//饿汉式第二种:静态代码块
class Singleton1 {
//创建一个私有变量
private static Singleton1 instance;
//构造器私有化
private Singleton1() {
}
//在静态代码块中完成类的实例化
static {
instance = new Singleton1();
}
//对外部提供获取对象实例的方法
public static Singleton1 getInstance() {
return instance;
}
}
优点:在类加载的过程中完成了对象实例化,避免了多线程的问题
缺点:没有达到懒加载(Lazy Loading)的效果,如果对于该类实例不使用,则造成了内存的浪费。
方式二:懒汉式
//懒汉式第一种:提供静态共有方法
//多个线程同时请求时,会创建多个对象实例,不推荐使用
class Singleton2 {
private static Singleton2 instance;
private Singleton2() {
}
//提供一个静态共有方法,只有当使用到该方法时,才会实例化对象
public static Singleton2 getInstance() {
if (instance == null) {
instance = new Singleton2();
}
return instance;
}
}
//懒汉式:同步处理代码
//效率太低
class Singleton3 {
private static Singleton3 instance;
private Singleton3() {
}
//提供一个静态共有方法,加入同步处理的代码,只有当使用到该方法时,才会实例化对象
public static synchronized Singleton3 getInstance() {
//增加synchronized,不会造成多个线程同时请求的问题
if (instance == null) {
instance = new Singleton3();
}
return instance;
}
}
//懒汉式第三种:不推荐
class Singleton4 {
private static Singleton4 instance;
private Singleton4() {
}
public static Singleton4 getInstance() {
if (instance == null) {
synchronized (Singleton4.class) {
instance = new Singleton4();
}
}
return instance;
}
}
优点:起到了懒加载的效果,只有需求请求获取对象实例时,才会创建对象实例。
缺点:线程不安全
方式三:双重检查法
//双重检查法
class Singleton5 {
private static volatile Singleton5 instance;
private Singleton5() {
}
public static Singleton5 getInstance() {
if (instance == null) {
synchronized (Singleton5.class) {
if (instance == null) {
instance = new Singleton5();
}
}
}
return instance;
}
}
优点:解决线程安全问题,也解决了懒加载问题,保证了效率,推荐使用
方法四:静态内部类
//静态内部类
//调用getInstance()方法时,加载静态内部类
class Singleton6 {
private Singleton6() {
}
private static class SingletonINSTANCE {
private static final Singleton6 INSTANCE = new Singleton6();
}
private static Singleton6 getInstance() {
return SingletonInSTANCE.INSTANCE;
}
}
方式五:枚举
//枚举
enum Singleton7 {
INSTANCE;
}
这是单例模式的五种实现方式。
问题二:讲讲线程与进程的区别?
回答:
线程是操作系统任务调度与执行的基本单元,进程是操作系统资源分配的基本单元
操作系统不会给线程分配内存空间,只会给进程分配不同的内存空间,使进程内的多个线程同时运行,线程组之间只能共享资源。
问题三:线程之间的通信方式有哪些?
回答:
这道问题,我不太清楚,所以,这里学习一下
线程间通信
问题四:用过redis吗?
回答:
redis是用C语言编写的,key-value类型的数据结构服务器,它具有高速读写,数据类型丰富等特点,可以存储String、List、Set、Hash、Sorted Set等五种类型的数据,支持持久化,支持事务,消息队列、消息订阅。
问题五:使用过SpringCloud吗?
使用SpringCloud,首先必须清楚微服务:
微服务
微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。另外,应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建。微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。
spring cloud
自己在做项目的时候,也接触到了springcloud框架,由于springboot框架略去了一些繁琐的xml文件配置,spring cloud利用Spring Boot的开发便利性巧妙地简化了分布式系统的开发,如设置网关ApiZuul、服务发现与注册Eureka、通过Ribbon均衡负载之后,分发到具体实现实例,这些都是一些小的微服务,贴出来springcloud项目的框架结构:
面试结束!!!