单例设计模式是指一个类只有一个实例,而且这个实例不人为控制,而是由代码来限制,并提供全局访问的方法,主要应用于向计数器这类只需要一个实例的业务。
1.饿汉式单例是指只要类一加载就会创建实例(线程安全)
public class Student { //私有化构造方法,只在本类使用 private Student(){}
//定义一个静态的本类属性 private static Student s = new Student();
//提供静态方法,返回唯一的实例 public static Student getInstance(){return s; } }
2.懒汉式单例不会在类加载时创建,它在调用方法获取时才会创建实例(线程不安全)
//私有化构造方法,只在本类使用 private Student(){} //定义一个静态的本类属性 private static Student s = null; //提供静态方法,返回唯一的实例,为了线程安全使用synchronized关键字确保指挥生成单例 public synchronized static Student getInstance(){ if(s==null){ s=new Student(); } return s; }
synchronized 同步锁会把整个方法都锁住,锁住的代码太多,锁的粒度太大会影响性能,使用双重判定锁可以只锁住几行代码,提升性能。
public class Student { //私有化构造方法,只在本类使用 private Student(){} //定义一个静态的本类属性 private static Student s = null; //提供静态方法,返回唯一的实例,使用双重判定锁确保线程安全 public static Student getInstance() { if (s == null) { synchronized (Student.class) { if (s == null) { s = new Student(); } } } return s; } }
(使用java反射机制可以实例化private的构造方法来创建实例,此时基本上会使所有的Java单例实现失效)
原文:https://www.cnblogs.com/dxx0921/p/10452886.html