码迷,mamicode.com
首页 > 其他好文 > 详细

Singleton

时间:2016-09-18 19:34:12      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:

1.//懒汉模式
//天生线程不安全,但是效率高
public class Singleton {
    private static Singleton singleton;
    private  Singleton() {}
    public static  Singleton getSingleton(){
        if(singleton==null){
            singleton=new Singleton();
            System.out.println("实例化Singleton");
        }
        return singleton;
    }
    
}

public class Test {
    public static void main(String[] args) {
        MyThread myThread1=new MyThread();
        MyThread myThread2=new MyThread();
        MyThread myThread3=new MyThread();
        myThread1.start();
        myThread2.start();
        myThread3.start();
    }
    //因为继承Thread每次都会新创建一个任务,所以可以达到效果,而使用Runnable不能够达到效果
    public static class MyThread extends Thread{
        int count=0;
        @Override
        public void run() {
            while(count<100){
                count++;
                Singleton.getSingleton();
            }
        }
    }
}

此程序输出的结果为:

实例化Singleton
实例化Singleton

说明此时实例化了两个Singleton,线程不安全!

2.在上面做一点改动

//改良版懒汉模式
//线程安全,但是效率低
public class Singleton {
    private static Singleton singleton;
    private  Singleton() {}
    public static  synchronized Singleton getSingleton(){
        if(singleton==null){
            singleton=new Singleton();
            System.out.println("实例化Singleton");
        }
        return singleton;
    }
    
}

public class Test {
    public static void main(String[] args) {
        MyThread myThread1=new MyThread();
        MyThread myThread2=new MyThread();
        MyThread myThread3=new MyThread();
        myThread1.start();
        myThread2.start();
        myThread3.start();
    }
    //因为继承Thread每次都会新创建一个任务,所以可以达到效果,而使用Runnable不能够达到效果
    public static class MyThread extends Thread{
        int count=0;
        @Override
        public void run() {
            while(count<100){
                count++;
                Singleton.getSingleton();
            }
        }
    }
}

3.饿汉模式

//饿汉模式
//线程安全,但每次加载类的时候都会实例化,若存在大量的此种单例模式,则会实例化很多无用实例
public class Singleton {
    private static Singleton singleton=new Singleton();
    private  Singleton() {}
    public static Singleton getSingleton(){
        System.out.println("Singleton");
        return singleton;
    }
}

4.饿汉模式

//饿汉模式,和第三种一样,只不过换个写法

public class Singleton {
    private static Singleton singleton = null;
    static {
        singleton = new Singleton();
    }

    private Singleton() {
    }

    public static Singleton getSingleton() {
        return singleton;
    }
}

5.静态内部类

//这种方式同样利用了classloder的机制来保证初始化instance时只有一个线程,它跟第三种和第四种方式不同的是(很细微的差别):
第三种和第四种方式是只要Singleton类被装载了,那么instance就会被实例化(没有达到lazy loading效果),而这种方式是Singleton类被装载了,instance不一定被初始化。
因为SingletonHolder类没有被主动使用,只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,从而实例化instance。
想象一下,如果实例化instance很消耗资源,我想让他延迟加载,另外一方面,我不希望在Singleton类加载时就实例化,
因为我不能确保Singleton类还可能在其他的地方被主动使用从而被加载,那么这个时候实例化instance显然是不合适的。这个时候,这种方式相比第三和第四种方式就显得很合理。
public
class Singleton { public static class SingletonHolder{ private static final SingletonHolder singletonHolder=new SingletonHolder(); private SingletonHolder(){}; public static SingletonHolder getSingletonHolder(){ return singletonHolder; } } }

 

Singleton

标签:

原文地址:http://www.cnblogs.com/yzjT-mac/p/5882655.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!