《MySql面试专题》
《MySql性能优化的21个最佳实践》
《MySQL高级知识笔记》
文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图
关注我,点赞本文给更多有需要的人
/**
- 懒汉式加载-线程不安全
*/
public class SingletonBeanLazyDg {
private SingletonBeanLazyDg(){}
private static SingletonBeanLazyDg singletonBeanLazyDg;
public static SingletonBeanLazyDg getInstance(){
if(singletonBeanLazyDg == null){
singletonBeanLazyDg = new SingletonBeanLazyDg();
}
return singletonBeanLazyDg;
}
public void draw(){
System.out.println(“lazy-singleton-dangerous”);
}
}
战将二:耶稣(懒汉式-线程安全)
这种方式具备很好的 lazy loading(延迟加载),能够在多线程中很好的工作,但是,效率很低,99% 情况下不需要同步。
/**
- 懒汉式加载-线程安全
*/
public class SingletonBeanLazy {
private SingletonBeanLazy (){}
private static SingletonBeanLazy singletonBeanLazy;
public static synchronized SingletonBeanLazy getInstance(){
if(singletonBeanLazy==null){
singletonBeanLazy = new SingletonBeanLazy();
}
return singletonBeanLazy;
}
public void draw(){
System.out.println(“lazy-singleton”);
}
}
战将三:野兽(饿汉模式)
这种方式没有加锁,执行效率会提高。但是类加载时就初始化,容易产生垃圾对象,浪费内存。 它基于 classloader 机制避免了多线程的同步问题,不过,instance 在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用 getInstance 方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化 instance 显然没有达到 lazy loading (延迟加载)的效果。
/**
- 饿汉式
*/
public class SingletonBeanHunger {
private SingletonBeanHunger(){}
private static SingletonBeanHunger singletonBeanHunger = new SingletonBeanHunger();
public static SingletonBeanHunger getInstance(){
return singletonBeanHunger;
}
public void draw(){
System.out.println(“hunger-singleton”);
}
}
战将四:鬼影(双检锁/双重校验锁(DCL,即 double-checked locking))
这种方式采用双锁机制,安全且在多线程情况下能保持高性能。
/**
- 双重校验锁/双检锁
*/
public class SingletonBeanDCL {
private SingletonBeanDCL(){}
private static volatile SingletonBeanDCL singletonBeanDCL;
public static SingletonBeanDCL getInstance(){
if(singletonBeanDCL==null){
synchronized (SingletonBeanDCL.class){
if (singletonBeanDCL == null){
singletonBeanDCL = new SingletonBeanDCL();
}
}
}
return singletonBeanDCL;
}
public void draw(){
System.out.println(“DCL-singleton”);
}
}
战将五:金童(登记式/静态内部类)
这种方式能达到双检锁方式一样的功效,但实现更简单。对静态域使用延迟初始化,应使用这种方式而不是双检锁方式。这种方式只适用于静态域的情况,双检锁方式可在实例域需要延迟初始化时使用。
/**
- 登记式/静态内部类
*/
public class SingletonBeanStatic {
private SingletonBeanStatic(){}
private static class SingletonBeanHolder{
private static final SingletonBeanStatic SINGLETON_BEAN_STATIC = new SingletonBeanStatic();
}
public static final SingletonBeanStatic getInstance(){
return SingletonBeanHolder.SINGLETON_BEAN_STATIC;
}
public void draw(){
System.out.println(“登记式/静态内部类”);
}
}
战将六:玉女(枚举)
虽然没被广泛应用,但是这是实现单例模式的最佳方法。它更简洁,自动支持序列化机制,绝对防止多次实例化。 这种方式是 Effective Java 作者 Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还自动支持序列化机制,防止反序列化重新创建新的对象,绝对防止多次实例化。
/**
- 枚举
*/
public enum SingletonBeanEnum {
INSTANCE;
public void draw(){
System.out.println(“枚举式单例”);
}
}
大Boss:皇帝(Main-单例)
我只是一个无辜的测试类
一线互联网大厂Java核心面试题库
正逢面试跳槽季,给大家整理了大厂问到的一些面试真题,由于文章长度限制,只给大家展示了部分题目,更多Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等已整理上传,感兴趣的朋友可以看看支持一波!
的一些面试真题,由于文章长度限制,只给大家展示了部分题目,更多Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等已整理上传,感兴趣的朋友可以看看支持一波!