设计模式
单例模式(8种写法)
- 饿汉式(静态变量)
public class Singleton{
private static final Singleton singleton= new Singleton();
//构造方法私有化
private Singleton{
}
public static Singleton getSingleton(){
return singleton;
}
}
- 饿汉式(静态代码块)
public class Singleton{
private static Singleton singleton;
//构造方法私有化
private Singleton{
}
//静态代码块
static{
singleton =new Singleton();
}
public static Singleton getSingleton(){
return singleton;
}
}
- 懒汉式(线程不安全) 单线程使用
public class Singleton{
private static Singleton singleton;
//构造方法私有化
private Singleton{
}
public static Singleton getSingleton(){
if(singleton==null){
singleton =new Singleton();
}
return singleton;
}
}
- 懒汉式(线程安全,同步方法)
public class Singleton{
private static Singleton singleton;
//构造方法私有化
private Singleton{
}
//效率太低
public static synchronized Singleton getSingleton(){
if(singleton==null){
singleton =new Singleton();
}
return singleton;
}
}
- 懒汉式(线程安全,同步代码块)
public class Singleton{
private static Singleton singleton;
//构造方法私有化
private Singleton{
}
//这种同步并不能起到线程同步的机制,不推荐使用
public static Singleton getSingleton(){
if(singleton==null){
synchronized(Sinleton.class){
singleton =new Singleton();
}
}
return singleton;
}
}
- 双重检查
public class Singleton{
private static volatile Singleton singleton;
//构造方法私有化
private Singleton{
}
public static Singleton getSingleton(){
if(singleton==null){
synchronized(this){
if(singleton==null){
singleton =new Singleton();
}
}
}
return singleton;
}
}
- 静态内部类
public class Singleton{
private static volatile Singleton singleton;
//构造方法私有化
private Singleton{
}
private static class SingletonIntance{
private static final intance=new SIngleton();
}
public static synchronized Singleton getSingleton(){
return SingletonIntance.intance;
}
- 枚举
public class User {
//私有化构造函数
private User(){ }
//定义一个静态枚举类
static enum SingletonEnum{
//创建一个枚举对象,该对象天生为单例
INSTANCE;
private User user;
//私有化枚举的构造函数
private SingletonEnum(){
user=new User();
}
public User getInstnce(){
return user;
}
}
//对外暴露一个获取User对象的静态方法
public static User getInstance(){
return SingletonEnum.INSTANCE.getInstnce();
}
}
推荐使用方式:双重校验、静态内部类、枚举、静态代码块
如有不足之处,请大家多多指教