设计模式——单例模式
单例模式分为懒汉和饿汉两种,下面是比较稳妥的实现方式:
懒汉:
package com.xueyoucto.xueyou;
/**
* Created by Administrator on 2016-07-07.
*/
public class IndexGenerator {
private static class LazyHolder {
private static final IndexGenerator INSTANCE = new IndexGenerator();
}
private IndexGenerator (){}
public static final IndexGenerator getInstance() {
return LazyHolder.INSTANCE;
}
}
饿汉:
package com.xueyoucto.xueyou;
/**
* Created by Administrator on 2016-07-07.
*/
public class Pool {
private Pool() {
}
public static final Pool pool = new Pool();
public static Pool getInstance(){
return pool;
}
}
下面是测试运行的代码:
package com.xueyoucto.xueyou;
/**
* Hello world!
*/
public class App {
public static void main(String[] args) {
System.out.println("Hello World!");
//饿汉单例模式
Pool p;
p = Pool.getInstance();
Pool p2;
p2 = Pool.getInstance();
System.out.println(p == p2);
IndexGenerator i1;
i1 = IndexGenerator.getInstance();
IndexGenerator i2;
i2 = IndexGenerator.getInstance();
System.out.println(i1 == i2);
}
}
运行结果:
首先现在是2019年12月份,上面的单例模式写的确实幼稚的很。
下面是一个更正
package com.example.demo.singleton;
public class StandardSingleton {
public volatile static StandardSingleton standardSingleton = null;
private StandardSingleton() {
}
public static StandardSingleton getInstance() {
if (standardSingleton == null) {
synchronized (standardSingleton) {
if (standardSingleton == null) {
standardSingleton = new StandardSingleton();
}
}
}
return standardSingleton;
}
}
里面涉及到的点一个是双重锁,一个是volatile防止指定重排。这些内容,在对dubbo源码分析的时候能够看到的。当然,也需要看一些博客和知识。这里推荐一下博客:
https://www.jianshu.com/p/e7446cdc7161
写的很详细,而且是一个dubbo系列的。最近正在看dubbo的源码。说来也感叹哈,从最开始接触java到现在,时光匆匆。。。