java单例模式
1. 简单使用的饿汉单例模式
/**
* 单例模式之饿汉模式,工作常用
*/
public class Single1 {
//1.构造函数私有,在外部不能通过构造函数创建对象
private Single1() {
}
//2.在内部创建一个对象
private static Single1 single = new Single1();
//3.通过静态的方式可以对外访问
public static Single1 getSingle() {
return single;
}
}
/**
* 单例模式测试方法
*/
public class SingleTest {
public static void main(String[] args) {
Single1 s1 = Single1.getSingle();
Single1 s2 = Single1.getSingle();
System.out.println(s1 == s2); // 测试s1和s2是否为同一个对象
}
}
2.懒汉单例模式
/**
* 懒汉式单例模式,在使用的时候去创建对象,节省内存.
* 但懒汉式单例模式,在多线程可能会创建多个单例对象
*/
public class Single2 {
private Single2() {
}
// 默认不创建单例对象
private static Single2 single = null;
public static Single2 getSingle() {
//如果有两个线程同时执行判断是否为空,就会创建两个单例对象
if (single == null) {
// 在使用的时候,创建单例对象
single = new Single2();
}
return single;
}
}
3. 懒汉单例模式升级双检索模式
/**
* 懒汉式单例模式升级版,著名的双检锁模式
* 通过两次检查判断单例对象是否存在,在第一次判断之后,加上锁之后,同时只运行一个线程进入,
* 如果单例对象为空,则创建单例对象昂,不为空则返回单例对象
*/
public class Single3 {
private Single3() {
}
private static Single3 single = null;
private static Object obj = new Object();
public static Single3 getSingle() {
if (single == null) {
synchronized (obj) {
if (single == null) {
single = new Single3();
}
}
}
return single;
}
}
秋风
2017-07-04