单例模式:指一个类只能有一个实例对象,且必须由该类自行创建;
懒汉式、饱汉式;
构造方法私有化,外部无法产生新的实例化对象,只能通过static方法取得实例化对象;
package com.zibo.design_mode.singleton;
public class SingletonHunger {
/**
* 在类的内部可以访问私有结构,所以可以在类的内部产生实例化对象
*/
private static final SingletonHunger instance = new SingletonHunger();
/**
* private 声明构造,不能直接通过new的方式进行创建
*/
private SingletonHunger() {
}
/**
* 返回对象实例
*/
public static SingletonHunger getInstance() {
return instance;
}
public void print() {
System.out.println("饿汉式单例模式!");
}
}
当第一次去使用Singleton对象的时候才会为其产生实例化对象的操作;
package com.zibo.design_mode.singleton;
public class SingletonLazy {
/**
* 声明变量
*/
private static volatile SingletonLazy singleton = null;
/**
* 私有构造方法
*/
private SingletonLazy() {
}
/**
* 提供对外方法
* @return 实例对象
*/
public static SingletonLazy getInstance() {
// 还未实例化
if (singleton == null) {
synchronized (SingletonLazy.class) {
if (singleton == null) {
singleton = new SingletonLazy();
}
}
}
return singleton;
}
public void print() {
System.out.println("懒汉式单例模式!");
}
}
当多个线程并发执行 getInstance 方法时,懒汉式会存在线程安全问题,所以用到了 synchronized 来实现线程的同步,当一个线程获得锁的时候其他线程就只能在外等待其执行完毕。而饿汉式则不存在线程安全的问题。