Singleton
单例模式,属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例)
枚举单利可以防止反序列化 ,
防止反射后重新new 实例。
Mgr01
/**
* 饿汗模式,
* 推荐使用
*/
public class Mgr01 {
private static final Mgr01 mgr01 = new Mgr01();
public static Mgr01 getInstance() {
return mgr01;
}
private Mgr01() {
}
public static void main(String[] args) {
//Mgr01.getInstance()
}
}
Mgr02
/**
* 于01相同
*/
public class Mgr02 {
private static final Mgr02 Instance;
static {
Instance=new Mgr02();
}
private Mgr02(){}
private static Mgr02 getInstance(){
return Instance;
}
public static void main(String[] args) {
Mgr02 instance = Mgr02.getInstance();
}
}
Mgr03
/**
* 懒汉式
* 单利模式
* 多线程访问实例不唯一
*/
public class Mgr03 {
private static Mgr03 INSTANCE;
private Mgr03(){}
private static Mgr03 getInstance(){
if(INSTANCE==null){
INSTANCE=new Mgr03();
}
return INSTANCE;
}
/**
* 以下线程不安全测试
* @param args
*/
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Thread(()->{
try {
Thread.sleep(1111);
} catch (InterruptedException e) {
e.printStackTrace();
}
int i1 = Mgr03.getInstance().hashCode();
System.out.println(i1);
}).start();
}
}
}
Mgr04
/**
* synchroized 方式性能低下
*/
public class Mgr04 {
private Mgr04() {
}
private static Mgr04 INSTANCE;
private synchronized static Mgr04 getInstance() {
if (null == INSTANCE) {
INSTANCE = new Mgr04();
}
return INSTANCE;
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Thread(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
int i1 = Mgr04.getInstance().hashCode();
System.out.println(i1);
}).start();
}
}
}
Mgr05
/**
* 多线程访问不能保证一个实例
*/
public class Mgr05 {
private Mgr05() {
}
private static Mgr05 INSTANCE;
/**
* 出现多线程并发问题。
* @return
*/
public static Mgr05 getInstance() {
if(null==INSTANCE){
synchronized (Mgr05.class){
INSTANCE=new Mgr05();
}
}
return INSTANCE;
}
}
Mgr06
/**
* 双重检查
* 算是完美状态,
*/
public class Mgr06 {
private Mgr06(){}
private static volatile Mgr06 INSTANCE;
public static Mgr06 getInstance(){
if(null==INSTANCE){
synchronized (Mgr06.class){
if(null==INSTANCE){
INSTANCE=new Mgr06();
}
}
}
return INSTANCE;
}
}
Mgr07
/**
* 静态内部类
* JVM保证单利
*/
public class Mgr07 {
private Mgr07(){}
private static class Mgr07Holder{
private final static Mgr07 INSTANCE=new Mgr07();
}
public static Mgr07 getInstance(){
return Mgr07Holder.INSTANCE;
}
}
Mgr08
/**
* 不仅解决了线程同步问题,还可以防止反序列化
*/
public enum Mgr08 {
INSTANCE;
public void m() {
}
public static void main(String[] args) {
Mgr08 instance = Mgr08.INSTANCE;
instance.m();
}
}