单例模式Singleton

1.含义

单例模式:即一个类只能创建一个实例。

  • 只有一个实例 --> 不可以从类外new对象 --> 构造器私有化private --> 从类里创建实例;
  • 这个对象供外部使用 --> 该实例的get方法 --> 没有对象,随着类加载 --> 方法声明为static --> 静态只能调静态 --> 该实例也声明为static;

2.实现

2.1 饿汉式

public class Singleton(){

    //1.私有化构造器;
private Singleton();
//2.创建实例;静态;
private static Singleton singleton = new Singleton();
//3.获取实例的公共方法;静态;
public static Singleton getSinggleton(){
return singleton;
}
}

特点

多线程安全:是;

lazy初始化:否;

类加载就创建实例,浪费内存;

2.2 懒汉式,线程不安全

public class Singgleton(){

    private Singleton();
private static Singleton singleton; //延迟创建对象;
public static Singleton getSingleton(){
if(singleton == null){ //调用方法的时候没有了再创建;
singleton = new Singleton();
}
return singleton;
}
}

特点

多线程安全:否 (当有多个线程操作时,可能会有多个线程都经过if判断语句,就会创建多个实例,造成线程不安全);

lazy初始化:是;

2.3 懒汉式,线程安全

public class Singleton(){

    private Singleton();
private static Singleton singleton;
//给方法加锁;
public static synchronized Singleton getSingleton(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}

特点

多线程安全:是

lazy初始化:是

效率:低(每次都只是一个线程拿到锁,调用方法,多个线程无法同时调用方法)

2.4 双重检验锁

public class Singleton(){

    private Singleton();
//使用volatile声明:
//1.禁止指令重排;
//2.保证变量修改后对所有线程可见,指示JVM,这个变量是共享且不稳定的,每次用要到主存中去读取;
private volatile static Singleton singleton();
public static Singleton getSingleton(){
if(singleton == null){ //判断有没有实例化过,没有再进入加锁模式,这样绝大多数的都不会再进入了;
synchronized(Singleton.class){
if(singleton == null){ //再判断一次,因为可能有多个线程都经过了前面的if,if不判断就会创建多个对象了;
singleton == new Singleton();
}
}
}
return singleton;
}
}

多线程安全:是

lazy初始化:是

效率:高

  • 第一个检验是为了效率;
  • 第二个检验为了线程安全;

直接加锁再判断 --> 效率低;

先判断再加锁 --> 效率高;

最新文章

  1. TLogger一个D7可用的轻量级日志
  2. CSS画猪
  3. hdu acm 1166 敌兵布阵 (线段树)
  4. JS怎么动态命名变量名
  5. 火狐浏览器修改userAgent
  6. mysql --The MEMORY Storage Engine--官方文档
  7. (IOS)悬浮按钮Demo
  8. Android 多分辨率机适应
  9. NSIS:迅雷5.8.6.600自由定制版脚本及下载
  10. 试图解释下ERP
  11. .NET Core 2.0 开源Office组件 NPOI
  12. 为什么HTTPS比HTTP更安全?
  13. Transaction check error: file /etc/rpm/macros.ghc-srpm from install of redhat-rpm-config-9.1.0-80.el7.centos.noarch conflicts with file from package epel-release-6-8.noarch Error Summary ----------
  14. python pip下载速度慢的解决方法
  15. ios dispatch_async使用
  16. oracle PLSQL 多结果集嵌套循环处理优化
  17. Tomcat 域名绑定多个Host配置要点
  18. CSDN博客专家申请成功
  19. String,Json,Map之间的转化
  20. 脱离MVC使用Razor模板引擎

热门文章

  1. TensorRT 数据和表格示例
  2. AI芯片体系结构目标图形处理
  3. 1482. 制作 m 束花所需的最少天数
  4. Pytorch线性规划模型 学习笔记(一)
  5. pytest初始化与清除(一)
  6. WordPress安装篇(1):使用PHPStudy安装WordPress
  7. MIT6.828-LAB1 : PC启动
  8. 浅谈lambda表达式<最通俗易懂的讲解
  9. Redis的数据安全与性能保障
  10. KDE桌面环境下konsole,kate等软件无法切换中文输入法