单例模式是确保一个类只有一个实例,并提供一个全局访问点。
单例模式没有公开的构造器,也就是不允许new,它只提供一个静态方法getInstance()(这个方法名是书上写的,自己写的时候应该可以根据情况自定义命名)来创建这个类的对象。在通过这种方式创建对象时,先判断内存中是否存在这个对象,如果存在,则直接返回该对象,反之则创建对象,然后再通过这个对象进行类中的方法。这样可以保证这个对象是独一无二的。
单例模式是在有一些情况下,我们其实只需要一个对象,如果存在多个,可能会导致程序异常。
单例模式与全局变量相比,单例模式可以根据自身情况控制对象的创建时间,而不是一开始就需要创建对象。造成资源浪费。
在定义单例模式时,考虑到性能问题,在使用单例模式时
1、可以使用“饿汉”模式,即在静态初始化器中创建单例对象,这种方式依赖jvm在加载这个类时创建唯一的对象。
2、其次还可以使用懒汉模式,即在第一次使用这个对象时创建对象,在“懒汉”模式需要使用双重检查加锁。在这里有两个关键字:
1.Volatile关键字有两层语义:一是保证了不同线程对这个变量进行操作的可见性,即一个线程修改了这个变量的值,其他线程立即可见的。二是禁止指令重排序。这里面涉及并发编程中三个概念原子性,可见性,有序性。这样可以保证多线程正确处理变量。
2.synchronized 上锁,防止并发。
//单例模式
public class SingletonPattern {
private SingletonPattern(){
}
//静态变量
private volatile static SingletonPattern singleton;
private static SingletonPattern getSingleton() {
return singleton;
}
public static SingletonPattern getInstance(){
//如果对象为空,则调用创建对象方法
if(null==singleton){
sysinit();
}
return singleton;
}
//创建实例对象
private static synchronized void sysinit(){
if(null==singleton){
//再次检查如果对象为空,则创建对象
singleton=new SingletonPattern();
}
}
}
单例模式没有公开的构造器,也就是不允许new,它只提供一个静态方法getInstance()(这个方法名是书上写的,自己写的时候应该可以根据情况自定义命名)来创建这个类的对象。在通过这种方式创建对象时,先判断内存中是否存在这个对象,如果存在,则直接返回该对象,反之则创建对象,然后再通过这个对象进行类中的方法。这样可以保证这个对象是独一无二的。
单例模式是在有一些情况下,我们其实只需要一个对象,如果存在多个,可能会导致程序异常。
单例模式与全局变量相比,单例模式可以根据自身情况控制对象的创建时间,而不是一开始就需要创建对象。造成资源浪费。
在定义单例模式时,考虑到性能问题,在使用单例模式时
1、可以使用“饿汉”模式,即在静态初始化器中创建单例对象,这种方式依赖jvm在加载这个类时创建唯一的对象。
2、其次还可以使用懒汉模式,即在第一次使用这个对象时创建对象,在“懒汉”模式需要使用双重检查加锁。在这里有两个关键字:
1.Volatile关键字有两层语义:一是保证了不同线程对这个变量进行操作的可见性,即一个线程修改了这个变量的值,其他线程立即可见的。二是禁止指令重排序。这里面涉及并发编程中三个概念原子性,可见性,有序性。这样可以保证多线程正确处理变量。
2.synchronized 上锁,防止并发。
//单例模式
public class SingletonPattern {
private SingletonPattern(){
}
//静态变量
private volatile static SingletonPattern singleton;
private static SingletonPattern getSingleton() {
return singleton;
}
public static SingletonPattern getInstance(){
//如果对象为空,则调用创建对象方法
if(null==singleton){
sysinit();
}
return singleton;
}
//创建实例对象
private static synchronized void sysinit(){
if(null==singleton){
//再次检查如果对象为空,则创建对象
singleton=new SingletonPattern();
}
}
}