package offer;
public class Test02 {
/**
* 01 饿汉模式 线程安全
*/
public static class Singleton{
private final static Singleton INSTANCE = new Singleton();
private Singleton (){}
public static Singleton getInstance(){
return INSTANCE;
}
}
/**
* 02 懒汉模式 非线程安全
*/
public static class Singleton2{
private static Singleton2 instance = null;
private Singleton2(){
}
public static Singleton2 getInstance(){
if (null == instance ){
instance = new Singleton2();//非线程安全
}
return instance;
}
}
/**
* 03 懒汉模式 线程安全 使用synchromized关键字修饰 效率低
*/
public static class Singleton3{
private static Singleton3 instance = null;
private Singleton3(){}
public static synchronized Singleton3 getInstance (){
if (null == instance){
instance = new Singleton3();
}
return instance;
}
}
/**
* 04 饿汉模式 线程安全 使用静态代码块 注意static的顺序
*/
public static class Singleton4 {
private static Singleton4 instance = null;
static {
instance = new Singleton4();
}
private Singleton4(){
}
public static Singleton4 getInstance(){
return instance;
}
}
/**
* 05 静态内部类方式
*/
public static class Singleton5{
private final static class SingletonHolder{
private static final Singleton5 INSTANCE = new Singleton5();
}
private Singleton5(){}
public static Singleton5 getInstance(){
return SingletonHolder.INSTANCE;
}
}
/**
* 06 枚举形式1
*/
public enum Singleton6{
INSTANCE;
public void anyMethod(){
}
}
/**
* 07 枚举形式2 推荐
*/
public static class EnumSingleton{
private EnumSingleton(){}
public static EnumSingleton getInstance(){
return Singleton.INSTANCE.getInstance();
}
private static enum Singleton{
INSTANCE;
private EnumSingleton singleton;
private Singleton(){
singleton = new EnumSingleton();
}
public EnumSingleton getInstance(){
return singleton;
}
}
}
/**
* 07 懒汉模式 线程安全 双重检验
*/
public static class Singleton7{
//使用volatile防止代码重排序,读到未初始化完成的instance对象
private volatile static Singleton7 instance = null;
private Singleton7(){
}
public static Singleton7 getInstance(){
if(null == instance){
synchronized(Singleton7.class){//局部使用同步方法,提高效率
instance = new Singleton7();
}
}
return instance;
}
}
// test
public static void main(String[] args){
System.out.println(Singleton.getInstance()== Singleton.getInstance());
System.out.println(Singleton2.getInstance() == Singleton2.getInstance());
System.out.println(Singleton3.getInstance() == Singleton3.getInstance());
System.out.println(Singleton4.getInstance() == Singleton4.getInstance());
System.out.println(Singleton5.getInstance() == Singleton5.getInstance());
System.out.println(Singleton6.INSTANCE == Singleton6.INSTANCE);
System.out.println(EnumSingleton.getInstance() == EnumSingleton.getInstance());
System.out.println(Singleton7.getInstance() == Singleton7.getInstance());
}
}
Java单例模式实现的几种方法
猜你喜欢
转载自blog.csdn.net/ma451152002/article/details/83117699
今日推荐
周排行