单例模式--饿汉(按需创建)、懒汉(多线程以及多线程下改进)

懒汉式:顾名思议,很懒惰,等到需要用到该对象的时候才去加载他。因为是单例,所有加载的时候先判断是否已经存在这个对象,如果存在返回已经创建的对象;如果不存在则取加载该对象。

package singleton;

/**
 * @author: ycz
 * @date: 2018/12/24 0024 22:15
 * @description: 懒汉模式
 */
public class SingleTon1 {
    public SingleTon1(){}
    private static SingleTon1 instance1 = null;

    public static SingleTon1 getInstance1(){
        if (instance1==null){
            instance1 = new SingleTon1();
        }
        return instance1;
    }
}

懒汉式在多线程情况下会存在并发问题。

第一种解决办法就是给get方法加上同步锁(synchronized),这虽然能解决问题,但是效率过低。所以有了下一种解决办法。

 

package singleton;

/**
 * @author: ycz
 * @date: 2018/12/24 0024 22:32
 * @description: 解决多线程问题(在创建单例时加锁)
 */
public class SingleTon3 {
    private SingleTon3(){}
    private static SingleTon3 instance3 = null;
    public static synchronized SingleTon3 getInstance3(){
        if (instance3 == null){
            instance3 = new SingleTon3();
        }
        return instance3;
    }
}

 

第二种解决懒汉式同步问题:只在创建对象的时候加锁,避免了方法加锁开销过大

 
package singleton;

/**
 * @author: ycz
 * @date: 2018/12/24 0024 22:36
 * @description: 在方法上加锁效率低下;可以先判断是否有创建过单例,如果没有在加锁创建
 */
public class SingleTon4 {

    private SingleTon4(){}

    private static final Object myLocker = new Object();

    private volatile static SingleTon4 instance4 = null;

    public static SingleTon4 getInstance4(){
        if (instance4 == null){
            synchronized (myLocker){
          if(instance4 = null)   instance4
= new SingleTon4(); } } return instance4; } }

 

 

饿汉式:因为很饿,所有很积极,每次类加载都直接创建实例,别人调用直接返回该实例。

package singleton;

/**
 * @author: ycz
 * @date: 2018/12/24 0024 22:21
 * @description: 饿汉模式
 */
public class SingleTon2
{
    private SingleTon2(){}
    private static final SingleTon2 instance2 = new SingleTon2();

    public static SingleTon2 getInstance2(){
        return instance2;
    }
}

 

饿汉式按需创建(推荐):解决饿汉式过早创建单例的问题;当需要创建式,再通过静态内部类取创建。

package singleton;

/**
 * @author: ycz
 * @date: 2018/12/24 0024 22:52
 * @description: 解决SingleTon2;创建过早问题
 */
public class SingleTon5 {
    SingleTon5() {
    }
    private static class Nested {
        private final static SingleTon5 INSTANCE5 = new SingleTon5();
    }
    public static SingleTon5 getInstance(){
        return Nested.INSTANCE5;
    }

}

 

这是SingleTon1(懒汉式)时会出现的问题:出现多个实例。

 

posted @ 2018-12-24 22:48  hyczzz  阅读(322)  评论(0编辑  收藏  举报