单例模式

饿汉模式 
public class Singleton01 {
private static final Singleton01 INSTANCE = new Singleton01();

private Singleton01(){}

public static Singleton01 getInstance(){return INSTANCE;}

public static void main(String [] args){
Singleton01 s1 = Singleton01.getInstance();
Singleton01 s2 = Singleton01.getInstance();
System.out.println(s1 == s2);
}
}

懒汉模式
public class Singleton03 {

//TODO 加final必须要初始化
private static Singleton03 INSTANCE;

private Singleton03(){}

/**
* 哈希码相同也可能不是同一个对象
*同一个类的不同对象 哈希码是不同的
* **/
public static Singleton03 getInstance(){
if(INSTANCE==null){
// try{
// Thread.sleep(300);
// }catch (Exception e){
// e.printStackTrace();
// }
INSTANCE = new Singleton03();
}
return INSTANCE;
}

/**
* 不同对象的哈希码不同
* **/
public static void main(String [] args){
for(int i=0;i<10;i++){

new Thread(()->{
System.out.println(Singleton03.getInstance().hashCode()); //不同对象的哈希码不同
}).start();

// new Thread(new Runnable() {
// @Override
// public void run() {
// //TODO 匿名内部类 lambda对只有一个方法的匿名接口
// }
// }).start();
}
}
枚举单例
public enum Singleton08 {
INSTANCE;

public void m (){} //业务处理 通过反射、发序列化方式

public static void main(String [] args){
for (int i=0;i<100;i++){
new Thread(()->{
System.out.println(Singleton08.INSTANCE.hashCode());
}).start();
}
}

double check 双重认证
public class Singleton06 {
private static volatile Singleton06 INSTANCE; //TODO 需要加volatile JIT语句重排 需要指令重排

private Singleton06(){}

private static Singleton06 getInstance(){
if(INSTANCE == null){
//双重检查
synchronized (Singleton06.class){
if(INSTANCE == null){
try{
Thread.sleep(1);
}catch (InterruptedException e){
e.printStackTrace();
}
INSTANCE = new Singleton06();
}
}
}
return INSTANCE;
}

public static void main(String [] args){
new Thread(()->System.out.println(Singleton06.getInstance())).start();
}
}
posted @ 2020-03-18 14:37  干饭人~  阅读(156)  评论(0编辑  收藏  举报