懒得铺垫了,直接上代码列举优缺点
饿汉式
public class SingleTon01 {
public static SingleTon01 SINGLETON01 = new SingleTon01();
private SingleTon01(){
}
public static SingleTon01 getInstance(){
return SINGLETON01;
}
}
优缺点
- 优点:实现简单,类加载到系统后就创建实例,JVM保证线程安全
- 缺点:不管是否使用,类加载的时候就完成实例化
懒汉式
public class SingleTon02 {
public static SingleTon02 INSTANCE;
private SingleTon02(){
}
public static SingleTon02 getInstance(){
if(null == INSTANCE){
INSTANCE = new SingleTon02();
}
return INSTANCE;
}
}
优缺点
- 优点:当使用到时才加载
- 缺点:存在线程安全问题
改进版本1:同步方法
public class SingleTon02 {
public static SingleTon02 INSTANCE;
private SingleTon02(){
}
public static synchronized SingleTon02 getInstance(){
if(null == INSTANCE){
INSTANCE = new SingleTon02();
}
return INSTANCE;
}
}
- 优点:线程安全
- 缺点:方法层级加所,同步区域大,影响并发性能
改进版本2:同步代码块
public class SingleTon02 {
public static SingleTon02 INSTANCE;
private SingleTon02(){
}
public static SingleTon02 getInstance(){
if(null == INSTANCE){
synchronized (SingleTon02.class){
if(null == INSTANCE){
INSTANCE = new SingleTon02();
}
}
}
return INSTANCE;
}
}
- 优点:线程安全
- 缺点:实现繁琐
静态内部类的方式
public class SingleTon03 {
private SingleTon03() {
}
public static SingleTon03 getInstance(){
return SingleTon03Holder.INSTANCE;
}
static class SingleTon03Holder{
public static final SingleTon03 INSTANCE = new SingleTon03();
}
}
- 优点:线程安全,没有使用到静态内部类的时候SingleTon03Holder不会被加载
枚举类的方式
public enum Singleton04 {
INSTANCE;
public void operation(){
System.out.println("my operation...");
}
}
- 优点:线程安全,实现简单
总结
除了普通的懒汉式,其他方式都是线程安全的。饿汉式和枚举类的方式实现逻辑简单。若没有特殊性能要求使用饿汉式即可