1、饿汉式
饿汉式单例模式(直接实例化饿汉式)
public class Singleton1 {
public static final Singleton1 INSTANCE = new Singleton1 ( ) ;
private Singleton1 ( ) {
}
}
饿汉式:枚举
public enum Singleton2 {
INSTANCE
}
静态代码块饿汉式
public class Singleton3 {
public static final Singleton3 INSTANCE ;
static {
INSTANCE = new Singleton3 ( ) ;
}
private Singleton3 ( ) {
}
}
2、懒汉式
懒汉式:存在线程安全问题,在需要的时候才创建实例
public class Singleton4 {
private static Singleton4 instance;
private Singleton4 ( ) {
}
public static Singleton4 getInstance ( ) {
if ( instance == null ) {
instance = new Singleton4 ( ) ;
}
return instance;
}
}
懒汉式:线程安全(双端检锁机制)
public class Singleton5 {
private static Singleton5 instance;
private Singleton5 ( ) {
}
public static Singleton5 getInstance ( ) {
if ( instance == null ) {
synchronized ( Singleton5 . class ) {
if ( instance == null ) {
instance = new Singleton5 ( ) ;
}
}
}
return instance;
}
}
懒汉式:创建静态内部类
public class Singleton6 {
private Singleton6 ( ) {
}
private static class Inner {
private static final Singleton6 INSTANCE = new Singleton6 ( ) ;
}
public static Singleton6 getInstance ( ) {
return Inner . INSTANCE ;
}
}
解决线程安全问题(双端检锁机制+volatile)
public class Singleton7 {
private static volatile Singleton7 instance = null ;
private Singleton7 ( ) {
System . out. println ( Thread . currentThread ( ) . getName ( ) + "\t" + "构造方法被执行" ) ;
}
public static Singleton7 getInstance ( ) {
if ( instance == null ) {
synchronized ( Singleton7 . class ) {
if ( instance == null ) {
instance = new Singleton7 ( ) ;
}
}
}
return instance;
}
public static void main ( String [ ] args) {
for ( int i = 0 ; i < 1000 ; i++ ) {
new Thread ( ( ) -> {
Singleton7 . getInstance ( ) ;
} , String . valueOf ( i) ) . start ( ) ;
}
}
}