首页 > 其他分享 >单例模式

单例模式

时间:2022-10-24 14:25:49浏览次数:47  
标签:Singleton private instance static 模式 单例 线程 public

单例模式

 饿汉式

由于对象在类里面才能被创建,而且是静态的,所以,被创建的对象始终都是一个,由于在类装载时就被完成了实例化,所以没有线程安全问题,如果没有使用这个实例,会造成内存浪费

//饿汉式
class Singleton1{
    public String name;
    private static final Singleton1 instance = new Singleton1();
    private Singleton1(){
        System.out.println("Singleton1,被构建对象");
    }
    public static Singleton1 getInstance(){
        return instance;
    }
}

懒汉式

线程不安全

起到了懒加载效果,但是只能在单线程使用,多线程会不安全,因为当多个线程并发同时判断instance为空时,就会相应的实例化多个对象。

class Singleton { //线程不安全
    private static Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {  //调用时才实例化对象,懒汉式
        if(instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

以线程安全的方式创建

上面线程不安全,那上锁不就好了,使用synchronized关键字。 这样虽然解决了线程安全,但其实实例化操作只做一次,而获取实例(即getInstance)的操作是很多次的,把调用的方法加上同步,会大大降低效率。

复制代码
class Singleton { //线程安全
    private static Singleton instance;
    private Singleton() {}
    //synchronized同步处理
    public static synchronized Singleton getInstance() {
        if(instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
复制代码 复制代码
class Singleton { //双重检查
    private static volatile Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if(instance == null) { //判断是否实例化
            synchronized (Singleton.class) {
                if(instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance; //否则直接return
    }
}
复制代码 复制代码
class Singleton {
    private static volatile Singleton instance;
    private Singleton() {}
    //静态内部类,包含一个静态属性:Singleton
    private static class SingletonInstance {
        private static final Singleton INSTANCE = new Singleton(); 
    }
    //对外公有的静态方法,直接返回SingletonInstance.INSTANCE
    public static synchronized Singleton getInstance() {
        return SingletonInstance.INSTANCE;
    }
}
复制代码

使用枚举也可以完成单例模式

复制代码
enum Singleton {
    INSTANCE; //属性
    public void say() {
        System.out.println("记得三连~");
    }
}
复制代码 复制代码
public static void main(String[] args) {
        Singleton instance1 = Singleton.INSTANCE;
        Singleton instance2 = Singleton.INSTANCE;
        System.out.println(instance1 == instance2);
    
        System.out.println(instance1.hashCode());
        System.out.println(instance2.hashCode());
        
        instance1.say();
    }
复制代码

测试结果

  • true
  • 460141958
  • 460141958
  • happy!

.

标签:Singleton,private,instance,static,模式,单例,线程,public
From: https://www.cnblogs.com/happy12123/p/16821259.html

相关文章

  • 观察者模式
    观察者模式观察者模式(ObserverDesignPattern):在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会得到通知并自动更新。观察者模式通用代码/......
  • 直播电商平台开发,设计模式单例模式
    直播电商平台开发,设计模式单例模式1.说明单例即只有一个实例,比如说配置、日志、连接池等,可以避免多个实例带来的多余的资源开销,并且在多线程环境下保证数据安全 2.类......
  • 标准SPI协议应用笔记:四种模式区分(CPOL/CPHA)
    前言标准的四线SPI包括CS、MISO、MOSI、CLK四根线,同时根据时钟线的相位和极性可以分为四种模式CPOL代表时钟的极性Polarity,即时钟线有效时(active)和无效时(inacitve)的电平......
  • golang隧道模式示例
    packagemainimport("net/url""net/http""bytes""fmt""io/ioutil")constProxyServer="ip.hahado.cn:3......
  • LVS DR模式 RealServer 为 Windows 2008 R2配置
    有3篇文档详细介绍​​http://kb.linuxvirtualserver.org/wiki/Windows_Servers_in_LVS/DR_and_LVS/TUN_Clusters​​​​http://blog.loadbalancer.org/direct-server-retu......
  • golang隧道模式代码示例
    packagemainimport("net/url""net/http""bytes""fmt""io/ioutil")constProxyServer="ip.hahado.cn:39010"typeProxyAuthstruct{LicensestringSecretKe......
  • 行为型设计模式之解释器模式
    解释器模式解释器模式属于行为型模式。它是指给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。是一种按照规定的语法(文法)进行......
  • 设计模式之原型模式
    概述在使用原型模式时,需要首先创建一个原型对象,再通过复制这个原型对象来创建更多同类型的对象。其定义如下:使用原型实例指定创建对象的种类,并且通过克隆这些原型创建新的......
  • 浅谈PHP设计模式的工厂模式
    简介工厂模式属于创建型模式,可以分为三种:简单工厂、工厂模式、抽象工厂。通俗讲就是用于如何优雅的创建对象而设计。当开发者不知道建什么对象,或者创建方式过于复杂的时......
  • 共体经济的无盈利运行模式
    我们通常认为:生产与经营就是为了盈利,盈利就是赚取生产成本价格与销售价格之间的差价,不过,要说农民春天撒下种子,秋天收获粮食,这是在盈利,那就成笑话了,可见,盈利和创造劳动价值......