单例模式学习总结

单例模式是确保一个类只有一个实例,并提供一个全局访问点。
单例模式没有公开的构造器,也就是不允许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();
  }
 }
}

猜你喜欢

转载自blog.csdn.net/cai_niao2015/article/details/80609982