package com.dudy.learn01.designPattern.singleton;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* Created by dudy on 2017/3/6.
*
* 静态内部类方式 实现
*
* 这种方式同样利用了classloder的机制来保证初始化instance时只有一个线程,
* 它跟饿汉式不同的是(很细微的差别):饿汉式是只要Singleton类被装载了,
* 那么instance就会被实例化(没有达到lazy loading效果),而这种方式是Singleton类被装载了,
* instance不一定被初始化。因为SingletonHolder类没有被主动使用,
* 只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,
* 从而实例化instance。想象一下,如果实例化instance很消耗资源,我想让他延迟加载,
* 另外一方面,我不希望在Singleton类加载时就实例化,
* 因为我不能确保Singleton类还可能在其他的地方被主动使用从而被加载,
* 那么这个时候实例化instance显然是不合适的。这个时候,这种方式相比饿汉式更加合理
*
*/
public class StaticClassInnerSingleton {
// 构造器 私有化
private StaticClassInnerSingleton(){}
private static class SingletonHolder{
private static final StaticClassInnerSingleton INSTANCE = new StaticClassInnerSingleton();
}
public static StaticClassInnerSingleton getInstance(){
return SingletonHolder.INSTANCE;
}
public static void main(String[] args) {
ThreadPoolExecutor pool = new ThreadPoolExecutor(10, 10,
6000 * 10, TimeUnit.MILLISECONDS,
new LinkedBlockingDeque<Runnable>());
for (int i= 0; i<20; i++){
pool.execute(new StaicSingletonTest());
//System.out.println(StaticClassInnerSingleton.getInstance().hashCode());
}
pool.shutdown();
}
}
class StaicSingletonTest implements Runnable{
public void run() {
StaticClassInnerSingleton intance = StaticClassInnerSingleton.getInstance();
System.out.println(intance.hashCode());
}
}