java单例模式使用详解

所属分类: 软件编程 / java 阅读数: 105
收藏 0 赞 0 分享

单例模式想必大家都已经很熟悉了,通常它的实现方式分为以下两种:

复制代码 代码如下:

//懒汉式实现
public class Singleton{
    private static Singleton instance = null;   
    private Singleton(){}
    public static newInstance(){
        if(null == instance){
            instance = new Singleton();
        }
        return instance;
    }
    public void doSomething(){
     // Do something ...
    }
}

//饿汉式
public class Singleton{
    private static Singleton instance = new Singleton();
    private Singleton(){}
    public static Singleton newInstance(){
        return instance;
    }
    public void doSomething(){
     // Do something ...
     }
}

在单利模式的使用中,懒汉式和饿汉式有不同的应用场景,如果创建单利对象很占内存但是不是在应用启动是必须使用的,我们一般会使用懒汉式,等到真的需要使用单利时才会去创建它,如果随着项目启动要立即使用我们会使用饿汉模式在初始化是创建单利对象。

上述两种模式中,如果在多线程的情况下,饿汉式不会出现问题,因为JVM只会加载一次单利类,但是懒汉式可能就会出现重复创建单利对象的问题,是线程不安全的。

那有没有办法,使饿汉式的单利模式也是线程安全的呢?答案肯定是有的,大家通常会使用加同步锁的方式去实现,但是这样实现起来比较麻烦,我们可以利用JVM的类加载机制去实现。在很多情况下JVM已经为我们提供了同步控制,比如:

a.在static{}区块中初始化的数据

b.访问final字段时 等等。

在JVM进行类加载的时候他会保证数据是同步的,我们可以这样实现:

采用类级内部类,在这个内部类里面去创建对象实例。这样的话,只要不使用类级内部类他就不会去创建对象实例,从而实现懒汉式的延迟加载和线程安全。

复制代码 代码如下:

public class Singleton{
    //内部类,在装载该内部类时才会去创建单利对象
    private static class SingletonHolder{
        public static Singleton instance = new Singleton();
    }

    private Singleton(){}

    public static Singleton newInstance(){
        return SingletonHolder.instance;
    }

    public void doSomething(){
        //do something
    }
}

这样就可以实现线程安全的饿汉式单利模式。

另外我们还可以通过枚举类型来实现单利模式,这也是比较推荐的方式。

使用枚举类型实现单例模式如下:

复制代码 代码如下:

public enum Singleton{
    //定义一个枚举的元素,它就是Singleton的一个实例
    instance;

    public void doSomething(){
        // do something ...
    }   
}

Ok,单例模式先介绍到这里。

更多精彩内容其他人还在看

Java实现一个简单的文件上传案例示例代码

这篇文章主要介绍了Java实现一个简单的文件上传案例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

详解在spring中使用JdbcTemplate操作数据库的几种方式

这篇文章主要介绍了详解在spring中使用JdbcTemplate操作数据库的几种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

java中的switch case语句使用详解

这篇文章主要介绍了java中的switch case语句使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

深入理解Java 线程池

这篇文章主要介绍了Java 线程池的相关资料,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
收藏 0 赞 0 分享

详解mybatis #{}和${}的区别、传参、基本语法

这篇文章主要介绍了mybatis #{}和${}的区别、传参、基本语法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

MyBatis 中 ${}和 #{}的正确使用方法(千万不要乱用)

这篇文章主要介绍了MyBatis 中 ${}和 #{}的正确使用方法,本文给大家提到了MyBatis 中 ${}和 #{}的区别,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Mybatis中的 ${} 和 #{}区别与用法

这篇文章主要介绍了Mybatis中的 ${} 和 #{}区别与用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Maven安装过程图文详解

这篇文章主要介绍了Maven安装过程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
收藏 0 赞 0 分享

SpringBoot登录拦截配置详解(实测可用)

这篇文章主要介绍了SpringBoot登录拦截配置详解(实测可用),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

JAVA 内存溢出案例汇总

这篇文章主要介绍了JAVA 内存溢出案例的汇总,文中讲解非常细致,帮助各位工作学习时避免内存溢出,感兴趣的朋友可以了解下
收藏 0 赞 0 分享
查看更多