欢迎来到代码驿站!

JAVA代码

当前位置:首页 > 软件编程 > JAVA代码

java单例模式使用详解

时间:2021-05-01 09:35:26|栏目:JAVA代码|点击:

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

复制代码 代码如下:

//懒汉式实现
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,单例模式先介绍到这里。

上一篇:Jenkins集成SonarQube的方法详解

栏    目:JAVA代码

下一篇:Java利用序列化实现对象深度clone的方法

本文标题:java单例模式使用详解

本文地址:http://www.codeinn.net/misctech/112754.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有