六种常见形式
1 饿汉式:直接创建对象,不存在线程安全问题
直接实例化饿汉式(简洁直观)
枚举式(最简洁)
静态代码块饿汉式(适全复杂实例化)
2 懒汉式:延迟创建对象
线程不安全(适用于单线程)
线程安全(适用于多线程)
静态内部类形式(适用于多线程)
饿汉式:
/*
*饿汉式:直接实例化饿汉式(简洁直观)
*1、构造器私有化
*2、自行创建,并且用静态变量保存
*3、向外提共这个实例
*4、强调一个单例,可以用final修改
*/
public class Singleton1(){
public static final Singleton1 INSTANCE = new Singleton1();
private Singleton1(){
}
}
public static void main(String[] args){
Singleton1 s= Singleton1.INSTANCE;
System.out.println(s);
}
/*
*枚举式,表示该类型的对象是有限的几个 1.5之后
*可以限定为一个成了单例
*/
public enum Singleton1(){
INSTANCE
}
public static void main(String[] args){
Singleton1 s= Singleton1.INSTANCE;
System.out.println(s);
}
/*
*静态代码块饿汉式
*
*/
public class Singleton1{
public static final Singleton1 INSTANCE;
static{
INSTANCE = new Singleton1();
}
private Singleton1(){
}
}
懒汉式:
/*
*线程不安全(适用于单线程)
*可以加 synchronized 同步代码块来解决线安全问题
*/
public class Singleton1{
private static Singleton1 instance;
private Singleton1(){
}
public static Singleton1 getInstance(){
if(instance == null){
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
instance = new Singleton1();
}
return instance;
}
}
public static void main(){
Singleton1 s1= Singleton1.getInstance();
}
/*
*线程安全(适用于多线程)
*/
public class Singleton1{
private static Singleton1 instance;
private Singleton1(){
}
public static Singleton1 getInstance(){
if(instance == null){
synchronized(Singleton1.class){
if(instance == null){
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
instance = new Singleton1();
}
}
}
return instance;
}
}
/*
*静态内部类形式(适用于多线程)
*内部类加载和初始代时,创建INSTANCE对象
*是单独加载和初始化getInstance,是线程安全的
*/
public class Singleton1{
private Singleton1(){
}
private static calss Inner{
private static final Singleton1 INSTANCE = new Singleton1();
}
public static Singleton1 getInstance(){
return Inner.INSTANCE;
}
}