博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
创造模式 单例模式
阅读量:6851 次
发布时间:2019-06-26

本文共 1861 字,大约阅读时间需要 6 分钟。

Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。

  • 饿汉式,JVM在加载这个类时就马上创建此唯一的单例实例
  • 懒汉式,单例实例在第一次被使用时构建,而不是在JVM在加载这个类时就马上创建此唯一的单例实例
  1. 饿汉式代码实例
public class Singleton {    private static Singleton INSTANCE = new Singleton();    private Singleton() {    }    public static Singleton getINSTANCE() {        return INSTANCE;    }}复制代码
  1. 懒汉式代码
public class Singleton {    private static Singleton INSTANCE;    private Singleton() {    }    public static synchronized Singleton getINSTANCE() {        if (INSTANCE == null) {            INSTANCE = new Singleton();        }        return INSTANCE;    }}复制代码
  1. 懒汉式代码2(双重加锁版本)
public class Singleton {    /**     * volatile保证,当uniqueInstance变量被初始化成Singleton实例时,     * 多个线程可以正确处理uniqueInstance变量     */    private static volatile Singleton INSTANCE;    private Singleton() {    }    public static Singleton getINSTANCE() {        //检查实例,如果不存在,就进入同步代码块        if (INSTANCE == null) {            //只有第一次才彻底执行这里的代码            synchronized (Singleton.class) {                //进入同步代码块后,再检查一次,如果仍是null,才创建实例                if (INSTANCE == null) {                    INSTANCE = new Singleton();                }            }        }        return INSTANCE;    }}复制代码
  1. 懒汉式代码3(静态内部类版本)

静态内部实现的单例是懒加载的且线程安全。 只有通过显式调用 getInstance 方法时,才会显式装载 SingletonHolder 类,从而实例化 instance(只有第一次使用这个单例的实例的时候才加载,同时不会有线程安全问题)。

public class Singleton {    //静态内部类    private static class SingletonHolder {        private static final Singleton INSTANCE = new Singleton();    }    private Singleton() {    }    public static Singleton getINSTANCE() {        return SingletonHolder.INSTANCE;    }}复制代码
  1. 饿汉式代码2(枚举模式)

使用枚举实现单例更简洁,自动支持序列化机制,绝对防止多次实例化 (如果单例类实现了Serializable接口,默认情况下每次反序列化总会创建一个新的实例对象

public enum  Singleton {    INSTANCE;    public void doSomething(){        //doSomething    }}复制代码

枚举单例的使用

Singleton instance = Singleton.INSTANCE;instance.doSomething();复制代码

转载地址:http://dzgul.baihongyu.com/

你可能感兴趣的文章
mysql行转列
查看>>
使用 firefox 的开发者工具与 DIG 命令行工具,来分析访问站点时的网络连接与 HTTP 请求和响应...
查看>>
jetspeed教程翻译——jetexpress项目门户的自定义
查看>>
华为usg6380 ssh 配置方法
查看>>
抽象工厂模式(Abstract Factory)
查看>>
zval_dtor与zval_ptr_dtor的区别
查看>>
Cisco route-map 源地址路由配置
查看>>
11月6日记
查看>>
[李景山php]每天TP5-20170109|thinkphp5-Model.php-2
查看>>
在windows(64)下安装php开发环境wamp+yaf框架+phpstorm以及TortoiseGit
查看>>
淘宝的IP地址库
查看>>
ORACLE 建库过程总结
查看>>
Comparable与Comparator的区别(转载)
查看>>
我的友情链接
查看>>
window下从硬盘安装ubuntu双系统
查看>>
socket服务器与客户机的互动
查看>>
三种方法实现选项卡效果
查看>>
API网关(API Gateway)
查看>>
Zookeeper集群搭建和简单使用
查看>>
IntelliJ IDEA快捷键
查看>>