本文共 1483 字,大约阅读时间需要 4 分钟。
单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
/** * 单例类 */public class Singleton { private static Singleton instance = null; // 构造方法让其private,禁止外界利用new创建此类实例的可能 // 所有类都有构造方法,不编码则系统默认生成空的构造方法, // 若有显示定义的构造方法,默认的构造方法就会失效. private Singleton(){ } // 获得本类实例的唯一全局访问点 public static Singleton getInstance(){ // 若实例不存在,new一个新实例,否则返回已有的实例 if(instance==null){ instance = new Singleton(); } return instance; }}
/** * 多线程时的单例 */public class SingletonMultiThread { private static SingletonMultiThread instance = null; private SingletonMultiThread(){ } // 单例对象的初始化同步 private static synchronized void syncInit() { // 多线程同时排队等候创建实例时,通过实例判断存在, // 避免第一个线程创建实例出来后,第二个线程再创建新实例,达到单例的目的。 if(instance==null){ instance = new SingletonMultiThread(); } } public static SingletonMultiThread getInstance(){ // 先判断实例是否存在,不存在再进行同步处理,即实例初始化 if(instance==null){ syncInit(); } return instance; }}
public class Main { public static void main(String[] args) { Singleton s1 = Singleton.getInstance(); Singleton s2 = Singleton.getInstance(); // 比较两次实例化结果对象是否相同 if(s1==s2){ System.out.println("两个对象是相同的实例"); } }}
输出结果为:
两个对象是相同的实例
单例模式与静态类初始化的区别:
1.静态类初始化,在自己被加载时就将自己实例化,被形象地称之为饿汉式单例类,
类一加载就实例化对象,提前占用系统资源。 2.单例模式,则在第一次被引用时,才会将自己实例化,被称为懒汉式单例类, 面临多线程访问时的安全性问题,需采取同步处理好多线程安全问题。
public class SingletonStatic { // 直接生成自己的内部对象实例 private static SingletonStatic instance = new SingletonStatic(); private SingletonStatic(){ } private static SingletonStatic getInstance(){ return instance; }}
转载地址:http://lyxmb.baihongyu.com/