静态代码块
public class SingletonStaticDemo {
private static SingletonStaticDemo singleton;
static {
singleton=new SingletonStaticDemo();
}
private SingletonStaticDemo(){
}
public static SingletonStaticDemo getInstance(){
return singleton;
}
}
静态变量(饿汉的方式)
public class SingletonDemo02 {
public static void main(String[] args) {
Singleton2 singleton=Singleton2.getInstance();
Singleton2 singleton1=Singleton2.getInstance();
System.out.println(singleton==singleton1);
System.out.println(singleton.hashCode());
System.out.println(singleton1.hashCode());
}
}
class Singleton2{
private Singleton2(){}
private static Singleton2 instance;
static {
instance=new Singleton2();
}
public static Singleton2 getInstance(){
return instance;
}
}
线程不安全
public class SingletonDemo03 {
public static void main(String[] args) {
Singleton03 singleton=Singleton03.getSingleton03();
Singleton03 singleton1=Singleton03.getSingleton03();
System.out.println(singleton==singleton1);
System.out.println(singleton.hashCode());
System.out.println(singleton1.hashCode());
}
}
class Singleton03{
private static Singleton03 singleton03;
private Singleton03(){}
public static Singleton03 getSingleton03(){
if(singleton03==null){
singleton03=new Singleton03();
}
return singleton03;
}
}
双重检查
public class SingletonDemo05 {
public static void main(String[] args) {
Singleton05 singleton=Singleton05.getSingleton05();
Singleton05 singleton1=Singleton05.getSingleton05();
System.out.println(singleton==singleton1);
System.out.println(singleton.hashCode());
System.out.println(singleton1.hashCode());
}
}
class Singleton05{
private static volatile Singleton05 singleton05;
private Singleton05(){}
public static Singleton05 getSingleton05(){
if(singleton05==null){
synchronized(Singleton05.class){
if(singleton05==null) {
singleton05 = new Singleton05();
}
}
}
return singleton05;
}
}
静态内部类
public class SingletionDemo06 {
public static void main(String[] args) {
Singleton06 singleton=Singleton06.getSingleton06();
Singleton06 singleton1=Singleton06.getSingleton06();
System.out.println(singleton==singleton1);
System.out.println(singleton.hashCode());
System.out.println(singleton1.hashCode());
}
}
class Singleton06{
private static Singleton06 singleton06;
private Singleton06(){}
private static class SingletonInstance{
private static final Singleton06 INSTANCE=new Singleton06();
}
public static Singleton06 getSingleton06(){
return SingletonInstance.INSTANCE;
}
}
枚举方式
public class SingletonDemo07 {
public static void main(String[] args) {
Singleton07 singleton=Singleton07.INSTANCE;
Singleton07 singleton1=Singleton07.INSTANCE;
System.out.println(singleton==singleton1);
System.out.println(singleton.hashCode());
System.out.println(singleton1.hashCode());
singleton.sayOk();
}
}
enum Singleton07{
INSTANCE;
public void sayOk(){
System.out.println("======ok");
}
}