前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java单例模式实现-3种方式

java单例模式实现-3种方式

作者头像
全栈程序员站长
发布2022-09-08 10:25:27
1760
发布2022-09-08 10:25:27
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

java单例模式

代码语言:javascript
复制
	java单例模式是java中经常使用到的一种情况,那么,要实现单例模式都有哪几种方法呢,下面介绍的是java单例模式的四种实现方法,分别是:
  1. 懒汉式
  2. 饿汉式
  3. 双检锁
  4. 静态内部类

懒汉式

代码语言:javascript
复制
	懒汉式故名思意就是懒,是等到需要使用的时候再创建单例。这就需要将构造函数私有化,在外部就不能创建对象,由内部创建。下面是懒汉模式的实现。
代码语言:javascript
复制
/**
 * 懒汉式
 * 单例模式的创建
 */
public class SingleDemo {
    public static SingleDemo singleDemo=null;
    private SingleDemo() {
    }
    public static SingleDemo getInstance(){
        if(singleDemo==null){
            singleDemo=new SingleDemo();
            return singleDemo;
        }else {
            return singleDemo;
        }
    }
}
代码语言:javascript
复制
	懒汉模式虽然简便也好理解,但是有线程安全的问题,当多个线程同时并发调用getInstance()函数时可能出现多列对象。

饿汉式

代码语言:javascript
复制
	饿汉式故名思意就是处于饥饿状态,类初始化一开始就创建出一个单列,当要使用时通过类函数获取得到。
代码语言:javascript
复制
/**
 * 饿汉式
 * 单例模式的创建
 * 在类加载时创建单例
 */
public class SingleDemo {
    public static SingleDemo singleDemo=null;
    //私有化构造函数,使其不能在外部构造
    private SingleDemo(){}
    static {
        singleDemo=new SingleDemo();
    }
    public static SingleDemo getInstance(){
        return singleDemo;
    }
}

双检锁

代码语言:javascript
复制
	为了解决懒汉式带来的线程安全问题,我们使用加锁的方式来同步代码。
	代码的设计如下:
代码语言:javascript
复制
package quartz;

/**
 * 懒汉式加强版-双检锁
 * 在需要使用时创建单例
 */
public class SingleDemo {
    public static SingleDemo singleDemo=null;
    //私有化构造函数,使其不能在外部构造
    private SingleDemo(){}
    public static SingleDemo getInstance(){
        //判单是否为首次创建实例
        if(singleDemo==null){
            //同步代码块,使得同一个SingleDemo类在加载这段代码时同步
            synchronized (SingleDemo.class){
                //再次判断实例是否被创建
                if(singleDemo==null){
                    singleDemo=new SingleDemo();
                    return singleDemo;
                }else {
                    return singleDemo;
                }
            }
        }else {
            return singleDemo;
        }
    }
}
代码语言:javascript
复制
	双检锁实现了对懒汉模式的加强,防止了单例模式的线程安全问题。

静态内部类

代码语言:javascript
复制
	静态内部类实现单例模式如图下:
代码语言:javascript
复制
/**
 * 静态内部类
 * 随静态内部类加载创建
 */
public class SingleDemo {
    private SingleDemo(){}
    public static class SingleDemo1{
        private static final SingleDemo Instance=new SingleDemo();
    }
    public static final SingleDemo getInstance(){
        return SingleDemo1.Instance;
    }
}
代码语言:javascript
复制
实例随静态内部类的类加载而创建,从而只有一个单例

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/157059.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • java单例模式
  • 懒汉式
  • 饿汉式
    • 双检锁
      • 静态内部类
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档