package com.study.factory;
/** 第一种
* @Description: 饿汉式单例写法
* @Author: cwm
* @CreateDate: 2020/12/1 0001 13:17
*/
public class Singleton {
/**
* 优点:提供静态变量实例化对象,在类加载的时候进行加载
* (jvm保证每个类只会被加载一次,所有对于多线程也是安全的)
* 缺点:如果该对象没有被使用,会造成内存使用
* 开发建议使用
*/
private static Singleton instance =new Singleton();
//私有构造器
private Singleton(){}
//提供静态方法返回对象实例
public static Singleton getInstance(){
return instance;
}
}
package com.study.factory;
/** 第二种
* @Description: 饿汉式
* @Author: cwm
* @CreateDate: 2020/12/1 0001 13:17
*/
public class Singleton {
/**
* 次写法和类变量加载方法一样
*/
private static Singleton instance ;
static {
instance=new Singleton();
}
//私有构造器
private Singleton(){}
//提供静态方法返回对象实例
public static Singleton getInstance(){
return instance;
}
}
package com.study.factory;
/** 第三种
* @Description: 懒汉式
* @Author: cwm
* @CreateDate: 2020/12/1 0001 13:17
*/
public class Singleton {
private static Singleton instance ;
//私有构造器
private Singleton(){}
//提供静态方法返回对象实例
//这种写法在多线程访问下是不安全的,不建议使用
public static Singleton getInstance(){
if (instance!=null){
instance=new Singleton();
}
return instance;
}
}
package com.study.factory;
/** 第四种
* @Description: 懒汉式
* @Author: cwm
* @CreateDate: 2020/12/1 0001 13:17
*/
public class Singleton {
private static Singleton instance ;
//私有构造器
private Singleton(){}
//提供静态方法返回对象实例
//这种写法虽然多线程是安全了,但是会导致程序效率下降,方法被串行化
public static synchronized Singleton getInstance(){
if (instance!=null){
instance=new Singleton();
}
return instance;
}
}
package com.study.factory;
/** 第五种
* @Description: 懒汉式
* @Author: cwm
* @CreateDate: 2020/12/1 0001 13:17
*/
public class Singleton {
private static Singleton instance ;
//私有构造器
private Singleton(){}
//提供静态方法返回对象实例
//这种写法也是多线程下会出现不安全问题
public static Singleton getInstance(){
if (instance!=null){
synchronized (Singleton.class){
instance=new Singleton();
}
}
return instance;
}
}
package com.study.factory;
/** 第六种
* @Description: 双重检查
* @Author: cwm
* @CreateDate: 2020/12/1 0001 13:17
*/
public class Singleton {
private static volatile Singleton instance ;
//私有构造器
private Singleton(){}
//提供静态方法返回对象实例
//这种是推荐使用的在多线程下是安全的,效率也还是可以的
public static Singleton getInstance(){
if (instance!=null){
synchronized (Singleton.class){
if (instance!=null){
instance=new Singleton();
}
}
}
return instance;
}
}
package com.study.factory;
/** 第七种
* @Description: 静态内部类
* @Author: cwm
* @CreateDate: 2020/12/1 0001 13:17
*/
public class Singleton {
//私有构造器
private Singleton(){}
/**
* 利用静态内部类在类装载是不会进行实例化的机制,
* 只有当引用到该类或者类属性才去加载,而且jvm也只会加载一次类
* 建议使用
*/
static class InnerClass{
private static final Singleton instance=new Singleton();
}
//提供外部获取实例静态方法
public static Singleton getInstance(){
return InnerClass.instance;
}
}
package com.study.factory;
/** 第八种方式
* @Description: 枚举类
* @Author: cwm
* @CreateDate: 2020/12/1 0001 13:17
*/
public class Singleton {
//私有构造器
private Singleton(){}
/**
* effective java作者推荐,这种写法是最完美的一种写法
* 根据枚举的特性实现单例
*/
enum InnerEnum{
INSTANCE;
private Singleton singleton;
private InnerEnum(){
this.singleton=new Singleton();
}
}
//提供外部获取实例静态方法
public static Singleton getInstance(){
return InnerEnum.INSTANCE.singleton;
}
}
注意:本文归作者所有,未经作者允许,不得转载