1.饿汉式(立即加载)
饿汉式是用空间换时间的方法,我看网上也说是没得多线程问题。但是看到《java多线程编程核心》说getInstance可能有非线程安全问题,不是很懂?
public class Singleton {
private static Singleton singleton=new Singleton();
private Singleton() {
}
public static Singleton getInstance(){
//立即加载类
//缺点是不能有其他实例变量
//getInstance没有同步可能出现非线程安全问题?(这个在java多线程编程核心上看到的)
return singleton;
}
}
2.懒汉式(延迟加载)
延迟加载:在 调用get()方法时实例才被创建。
线程不安全
public class SingletonLH {
private static SingletonLH singletonLH;
private SingletonLH(){}
public static SingletonLH getInstance(){
if(singletonLH==null){
singletonLH=new SingletonLH();
}
return singletonLH;
}
}
线程安全方法getInstance加锁,效率低,因为加锁后变成同步了
public class SingletonLH {
private static SingletonLH singletonLH;
private SingletonLH(){}
public static synchronized SingletonLH getInstance(){
if(singletonLH==null){
singletonLH=new SingletonLH();
}
return singletonLH;
}
}
非线程安全方法,虽然在关键位置加锁了,无法解决同一个实例对象的结果。
public class SingletonLH {
private static SingletonLH singletonLH;
private SingletonLH(){}
public static SingletonLH getInstance(){
if(singletonLH==null){
synchronized(SingletonLH.class) {
singletonLH = new SingletonLH();
}
}
return singletonLH;
}
双层加锁机制,解决不同步问题
public class SingletonLH {
private volatile static SingletonLH singletonLH;
private SingletonLH(){}
public static SingletonLH getInstance(){
if(singletonLH==null){
synchronized(SingletonLH.class){
if(singletonLH==null){
singletonLH = new SingletonLH();
}
}
}
return singletonLH;
}
}
}
静态内置类,也可以解决非线程安全问题
public class SingletonLH {
private static class SingleHander{
private static SingletonLH singletonLH=new SingletonLH();
}
private SingletonLH(){}
public static SingletonLH getInstance(){
return SingleHander.singletonLH;
}
}
3.通过静态代码块实现单例模式,类似于饿汉
public class Singleton {
private static Singleton singleton=null;
private Singleton() {
}
static {
singleton= new Singleton();
}
public static Singleton getInstance(){
return singleton;
}
}
4.枚举实现单例模式