单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
/**
* 单例类
*/
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;
}
}