简介
单例模式就是确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
使用场景
- 要求生产唯一序列号的环境。
- 在整个项目中需要一个共享访问点或共享数据。
- 创建一个对象需要消耗的资源过多,如要访问IO和数据库等资源。
实现
恶汉式单例
public class Singleton{
private static final Singleton singleton=new Singleton();
//限制产生多个对象
private Singleton(){
}
//通过该方法获取实例对象
public static Singleton getSingleton(){
return singleton;
}
//类中其他方法,尽量是static
public static void doSomething(){
}
}
懒汉式单例
public class Singleton{
private static Singleton singleton=null;
//限制产生多个对象
private Singleton(){
}
//通过该方法获取实例对象
public static synchronized Singleton getSingleton(){
if(singleton==null){
singleton=new Singleton();
}
return singleton;
}
//类中其他方法,尽量是static
public static void doSomething(){
}
}
上面两种方法都能够在解决线程不安全的问题,第一种方法使得在加载类的时候便进行实例化;第二种方法则使用synchronized
关键字进行了同步,但除了第一次外,在其他时候使用该同步方法时,synchronized
都是多余的。为此,可以使用一下代码进行实现。
public class Singleton{
private static volatile Singleton singleton=null;
//限制产生多个对象
private Singleton(){
}
//通过该方法获取实例对象
public static synchronized Singleton getSingleton(){
if(singleton==null){
synchronized(Singleton.class){
if(singleton==null){ //再次判断
singleton=new Singleton();
}
}
}
return singleton;
}
//类中其他方法,尽量是static
public static void doSomething(){
}
}
- volatile关键字确保,当singleton变量初始化陈Singleton实例时,多个线程正确地处理singleton变量。.