java 23种模式 单例模式

原创
2017/04/01 16:10
阅读数 28
public class Test {
    static ExecutorService pool = Executors.newFixedThreadPool(2000);
    public static void main(String[] arg){
        List<Callable<String>> tasks = new LinkedList<>();
        for(int i=0;i<2000;i++){
            tasks.add(()->{
                System.out.println(Thread.currentThread().getName()+":"+Instance.getInstance());
                return "";
            });
        }
        try{
            pool.invokeAll(tasks);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        System.out.println("完成---》");
    }
}
class Instance{
    volatile static Instance instance = null;
    public static Instance getInstance(){
        if(instance==null){
            System.out.println(Thread.currentThread().getName()+": ready in");
            synchronized(instance){
                System.out.println(Thread.currentThread().getName()+": in");
                if(instance==null){
                    System.out.println(Thread.currentThread().getName()+":实例化");
                    instance = new Instance();
                }
            }
        }
        return instance;
    }
    private static class InnerInstance{
        static Instance  instance  = new Instance();
    }
    public static Instance getInstance2(){
        return InnerInstance.instance;
    }
}

以上是单例模式的 使用双重锁 和 内部类的实现方式,

当时你会发现在对instance加锁的时候,不会有一个线程阔以拿到这个锁,因为空对象应该虚拟机不会分配一个monitor,也就拿不到锁了

所以你必须得修改成对一个obj的加锁

static Object obj = new Object();

synchronized(obj){......}

这样;

还有为何要在instance 前面加一个volatile?

由于volatile可见性,不然会出现实例化多次的结果。

 

 

 

 

展开阅读全文
打赏
0
2 收藏
分享
加载中
更多评论
打赏
0 评论
2 收藏
0
分享
返回顶部
顶部