单例模式指的是一个类永远都只有一个实例,如需要共享某对象,需要对资源统一管理,就可以用单例。 饿汉模式:
public class Singleton {
private final static Singleton INSTANCE = new Singleton();
// Private constructor suppresses
private Singleton() {}
// default public constructor
public static Singleton getInstance() {
return INSTANCE;
}
}
很简单,不解释。 懒汉模式:
package com.pocketdigi.patterns.singleton;
public class Singleton {
private int a;
/**
* 需要用volatile修饰
* 原因:
* new Singleton()非原子操作,不能一步完成。分三步:、
* 1、给Singleton实例分配空间
* 2、初始化Singleton构造器
* 3、将instance指定实例的引用
* 但JVM可能乱序执行,不一定是1-2-3,也可能是1-3-2,当1-3-2时,执行完3,
* instance就不会==null了, 如果此时CPU刚好切换到另一个线程上,
* 会导致这个线程得到的实例没有初始化
*/
private volatile static Singleton instance;
/**
* private的构造方法,确保不会在外部被调用
*/
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
//用同步块,保证多线程访问时new Singleton只会执行一次
synchronized (Singleton.class) {
//后面的线程,可能进了if,在synchronized前等待,所以这里还要再判断一次是否==null
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
}
使用懒汉模式时,一定要注意。 调用:
//单例
Singleton singleton=Singleton.getInstance();
singleton.setA(10);
Singleton singleton2=Singleton.getInstance();
System.out.println(singleton2.getA());