饿汉模式
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();
}
}