饿汉式
public class SingleInstanceTest{
private static final SingleInstanceTest INSTANCE = new Mgr01();
private SingleInstanceTest(){};
public static SingleInstanceTest getInstance(){
return INSTANCE;
}
public static void main(String[] args){
long start = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
new Thread(() -> {
System.out.println(SingleInstanceTest.getInstance().hashCode());
}).start();
}
long end = System.currentTimeMillis();
log.info("耗时:{}ms", end - start );
}
}
懒汉式
public class SingleInstanceTest {
private static SingleInstanceTest INSTANCE ;
private SingleInstanceTest() {}
public void methodInstance() {
System.out.println("方法内部实例化:" + this.hashCode());
}
public static synchronized SingleInstanceTest getInstance01() {
if(ObjectUtil.isNull(INSTANCE)){
INSTANCE = new SingleInstanceTest();
}
return INSTANCE;
}
public static SingleInstanceTest getInstance02() {
if(ObjectUtil.isNull(INSTANCE)){
synchronized (SingleInstanceTest.class){
if(ObjectUtil.isNull(INSTANCE)){
INSTANCE = new SingleInstanceTest();
}
}
}
return INSTANCE;
}
private static class SingletonHolder{
private static final SingleInstanceTest INSTANCE = new SingleInstanceTest();
}
public static SingleInstanceTest getInstanceByStaticInnerClass() {
return SingletonHolder.INSTANCE;
}
public static void main(String[] args) {
long start = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
new Thread(() -> {
System.out.println(SingleInstanceTest.getInstanceByStaticInnerClass());
}).start();
}
long end = System.currentTimeMillis();
log.info("耗时:{}ms", end - start );
}
}
枚举类实现单例设计模式
public enum SingleInstanceTest2 {
INSTANCE
public void test() {
System.out.println("testInstance:" + this.name() + ":" + this.hashCode());
}
public static void main(String[] args) {
long l = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
new Thread(()->{
SingleInstanceTest2.INSTANCE.hashCode();
}).start();
}
System.out.println("time:" + (System.currentTimeMillis() - l) + "ms");
}
}