一,实现一之懒汉
/*
* 单利模式,懒汉模式,是线程安全的
*/
public class Singleton {
public static Singleton instance = new Singleton();
private Singleton(){
}
public static Singleton getInstance(){
return instance;
}
}
二,实现二之饿汗
/*
* 单利模式,饿汉,是线程不安全的,需要特殊的处理
*/
public class Singleton {
/**
* 对保存实例的变量加volatile修饰,因为在jdk1.4以前的版本中,很多JVM对对volatile关键字的实现有问题
* 会导致双重检查加锁的失败,因此双重检查加锁的机制只能用在jdk1.5以及以上的版本中
*volatitle和C++一样,能屏蔽掉虚拟机中一些必要的优化代码
*/
private volatile static Singleton instance = null;
private Singleton(){
}
public static Singleton getInstance(){
if(instance == null){
synchronized (Singleton.class) {
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
三,使用静态内部类实现单利,巧妙的同时实现了延迟加载和线程安全
(一)静态内部类
静态内部类相当于外部类的static成分,它的对象与外部类对象间不存在依赖关系,因可直接创建。而非静态内部类的实例,是绑定在外部对象的实例中的
静态内部类中,可以定义静态方法,在静态方法中只能够引用外部类的静态成员
静态内部类相当于其外部类的成员,只有在第一次被使用的时候才会被加载
(二)多线程缺省同步锁
有静态初始化器(静态字段上或静态代码块的初始器)初始化数据时
访问final字段时
在创建线程之前创建对象时
线程可以看见它将要处理的对象时
/*
* 利用静态内部类和多线程缺省同步锁
*/
public class Singleton {
private static class SingletonHolder{
/**
* 静态初始化器,由JVM来保证线程安全
*/
private static Singleton instance = new Singleton();
}
private Singleton(){
}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}
四,利用枚举
单元素的枚举可以实现单例
枚举实质是功能齐全的类
/*
* 利用枚举实现单利
*/
public enum Singleton {
uniqueInstance;
public void singletonOperation(){
System.out.println("单利对象的业务方法");
}
}