• 设计模式-单例模式


    单例模式(Singleton pattern) 是一种常见的设计模式,常见的有两种写法:饿汉式单例、懒汉式单例。

    单例模式定义

    确保一个类只有一个实例,并提供一个全局访问点。

    饿汉式单例

    饿汉式单例,构造方法私有化,类加载的同时创建实例,代码如下:

     1 public class MyClass {
     2     
     3     private static MyClass instance = new MyClass();
     4 
     5     private MyClass() {}
     6 
     7     public static MyClass getInstance() {
     8         return instance;
     9     }
    10 
    11     // 测试
    12     public static void main(String[] args) {
    13         MyClass m1 = MyClass.getInstance();
    14         MyClass m2 = MyClass.getInstance();
    15         System.out.println(m1 == m2);
    16     }
    17 }
    18 
    19 // 输出结果:
    20 // true

    懒汉式单例

    懒汉式单例同样将构造方法私有化,只是在第一次调用类的时候才创建实例,代码:

     1 public class MyClass {
     2     
     3     private static MyClass instance;
     4 
     5     private MyClass() {}
     6 
     7     public static MyClass getInstance() {
     8         if(instance == null) {
     9             instance = new MyClass();
    10         }
    11         return instance;
    12     }
    13 }

    懒汉式单例有个问题,就是多线程并发访问时,可能会出错,创建出多个实例对象;当然,我可以用“synchronized”关键字修饰 getInstance方法,强制每个线程进入这个方法之前,要先等别的线程离开该方法,确保不出错;但是,这会降低性能,而且,只有第一次执行该方法时 才需要同步;所以在使用时,如果确实有高并发的情况,建议用饿汉式编写代码。也可以用双重检查加锁的方式,首先检查是不是已经创建了实例,如果未创建,再 进行同步。代码:

    public class MyClass {
        
        private volatile static MyClass instance;
    
        private MyClass() {}
        
        public static MyClass getInstance() {
            if(instance == null) {
                synchronized (MyClass.class) {
                    if(instance == null) {
                        instance = new MyClass();
                    }
                }
            }
            return instance;
        }
    }
  • 相关阅读:
    ScheduledThreadPoolExecutor源码解读
    Spring事务源码阅读笔记
    Spring AOP的实现研究
    cglib之Enhancer
    Spring IOC容器创建bean过程浅析
    CompletionService简讲
    Spring Boot:关于“No converter found for return value of type: class xxx”的解决方法
    java关于Date转换成字符串格式以及Date的增加
    jsp中文乱码六种情况---解决方案
    MYSQL给表添加字段
  • 原文地址:https://www.cnblogs.com/LikeStar/p/5655758.html
Copyright © 2020-2023  润新知