今天我们来说说一个非常常用的模式,单例模式,单例模式让某个类中有自己的实例,而且只实例化一次,避免重复实例化,单例模式让某个类提供了全局唯一访问点,如果某个类被其他对象频繁使用,就可以考虑单例模式,以下用代码来分析:

饿汉式单例模式举例:

/*
 *  饿汉式单例模式
 *  饿汉式的这种单例模式是线程安全的
 *  需要根据业务需求来觉得要不要使用饿汉式单例模式
 */
public class SingletonHungry {

    /*
     * 直接以变量的形式实例化了当前对象,并进行了私有化,(这种方式的话在不管被不被使用,就已经实例化)
     */
    private static SingletonHungry singletonHungry = new SingletonHungry();

    public static SingletonHungry getInstance() {
        return singletonHungry;
    }

    public void printlnMethod() {
        System.out.println("线程安全的饿汉式单例模式...");
    }

}

懒汉式单例模式

// 懒汉式单例模式
// 懒汉式的这种单例模式是线程不安全的,因为多线程并发性调用就会引发线程不安全问题
// 需要根据业务需求来觉得要不要使用懒汉式单例模式

public class SingletonLazy {

    /*
     * 首先申明一个对象变量,变量都是必须私有化
     */
    private static SingletonLazy singletonLazy = null;

    public static SingletonLazy getInstance() {

        if (null == singletonLazy) {
            singletonLazy = new SingletonLazy();
        }
        return singletonLazy;

    }

    public void printlnMethod() {
        System.out.println("懒汉式单例模式,线程不安全的,因为多线程并发调用会导致线程不安全");
    }
}

以上的懒汉式单例模式,有不足之处,所以以下这个案例就是解决多线程并发调用引发的不安全问题:

/*
 * 之前提到的懒汉式单例模式,存在多线程并发调用引发线程不安全问题,现在就增加同步来解决这个问题
 */
public class SingletonUpdate {

    private static SingletonUpdate singletonUpdate = null;

    public static SingletonUpdate getInstance() {
        if (null == singletonUpdate) {
            synchronized (SingletonUpdate.class) {
                if (null == singletonUpdate) {
                    singletonUpdate = new SingletonUpdate();
                }
            }
        }
        return singletonUpdate;
    }

    public void printlnMethod() {
        System.out.println("懒汉式单例模式,线程不安全的,因为多线程并发调用会导致线程不安全
          这个是Update升级版....");
    }

测试程序:

// 测试程序
public class Main {

    public static void main(String[] args) {

        SingletonHungry.getInstance().printlnMethod();

        SingletonLazy.getInstance().printlnMethod();

        SingletonUpdate.getInstance().printlnMethod();

    }

}

运行结果:
这里写图片描述

单例模式还有很多种实现方式,只是列举了普遍的三种给大家分享!!!


例如我在举例一种:
静态内部类单例模式:

/*
 * 内部静态类 单例模式
 */
public class SingletonState {

    public SingletonState() {
        // TODO Auto-generated constructor stub
    }

    private static class SingletonClass {
        public static SingletonState singletonState = new SingletonState();
    }

    public static SingletonState getNewInstance() {
        return SingletonClass.singletonState;
    }

    public void printlnMethod() {
        System.out.println("内部静态类 单例模式...");
    }

}

还有枚举方式的,….. 省略 , 就不写了, 谢谢大家观看!!!!!!!!


谢谢大家的观看,更多精彩技术博客,会不断的更新,请大家访问,
刘德利CSDN博客, http://blog.csdn.net/u011967006