设计模式之单例模式

1.单例模式概念

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

2.单例模式的几种模式

1)饿汉式单例模式

static在类的加载时,就创建了对象,线程是安全的

2)懒汉式线程不安全单例模式

使用方法创建单例,但是在多线程下是不安全的,(两个或多个线程同时获取单例,并且实例还没有创建)

3)懒汉式线程安全单例模式

使用方法创建单例,并且在方法上加上synchronized锁(把这个方法锁住了,想要访问这个的单例时候需要等别的线程使用完毕)

3.懒汉式与饿汉式的区别

懒汉式在类加载时就已经创建了对象实例,饿汉式在第一次方法调用时才加载

4.懒汉式线程安全与线程不安的区别

在方法上加上synchronized锁,其他线程在使用的时候就需要等待正在使用线程使用完毕才行.

(举个栗子:当你上厕所时,忘记锁门了,来了一个着急上厕所的,看见没有锁,也不知道你在使用,可能就闯进去了)

5.代码实现

1)普通类Singer

java 复制代码
package org.xiji.single;

/**
 * 普通类
 */
public class Singer {
}

2)饿汉式单例类SingleEager

java 复制代码
package org.xiji.single;

/**
 * 饿汉式
 */
public class SingleEager {
    /**
     * 静态变量 类加载时就已经创建,并且只创建一次,所以是线程安全的
     */
    private static SingleEager singleEager = new SingleEager();

    /**
     * 获取单例
     */
    public static SingleEager getSingleEager(){
        return singleEager;
    }
}

3)懒汉式单例模式线程不安全SingleLazyUnSafe

java 复制代码
package org.xiji.single;

/**
 * 单例模式,线程不安全
 */
public class SingleLazyUnSafe {

    private static SingleLazyUnSafe instance;

    /**
     * 获取实例
     */
    public static SingleLazyUnSafe getInstance(){
        //如果 实例为空,则创建实例
        if (instance == null) {
            return new SingleLazyUnSafe();
        }
        //实例不为空,返回实例
        return instance;
    }
}

4)懒汉式单例模式线程安全

java 复制代码
package org.xiji.single;

/**
 * 线程安全
 */
public class SingleLazySafe {
    // 使用锁 保证线程安全
    private static SingleLazySafe singleLazySafe; //定义单例对象

    /**
     * 这个相对于线程不安全的区别就是加锁了 多了一个synchronized
     *
     */
    public static synchronized SingleLazySafe getInstance(){
        if(singleLazySafe == null){
            singleLazySafe = new SingleLazySafe();
        }
        return singleLazySafe;
    }
}

SingleMain类

java 复制代码
package org.xiji.single;

/**
 * 单例模式
 */
public class SingleMain {
    public static void main(String[] args) {

        /**
         * 创建普通对象
         */
        Singer singer = new Singer();
        Singer singer1 = new Singer();
        System.out.println("普通对象是否相等" +singer.equals(singer1));
        //肯定是不相等的
        System.out.println("==================================================");
        /**
         * 通过饿汉式单例模式创建
         */
        SingleEager singleEager = SingleEager.getSingleEager();
        SingleEager singleEager1 = SingleEager.getSingleEager();

        System.out.println("单例模式对象是否相等" +singleEager.equals(singleEager1));
        //肯定是相等的
        System.out.println("==================================================");

        /**
         *  通过懒汉式线程安全的单例模式创建  + synchronized锁
         */
        SingleLazySafe singleLazySafe = SingleLazySafe.getInstance();

        /**
         * 通过懒汉式线程不安全的单例模式创建  不加 synchronized锁
         */
        SingleLazyUnSafe singleLazyUnSafe = SingleLazyUnSafe.getInstance();
    }
}

5)运行结果

相关推荐
codergjw6 分钟前
常见面试题
java
咕噜企业分发小米7 分钟前
如何平衡服务器内存使用率和系统稳定性?
java·服务器·前端
李子园的李9 分钟前
函数式编程与传统编程的对比——基于java
java
爬山算法9 分钟前
Netty(13)Netty中的事件和回调机制
java·前端·算法
南极企鹅28 分钟前
Gson转义特殊字符
java
Mr_Xuhhh44 分钟前
第一部分:类和对象(中)— 取地址运算符重载
java·开发语言
Selegant1 小时前
告别传统部署:用 GraalVM Native Image 构建秒级启动的 Java 微服务
java·开发语言·微服务·云原生·架构
__万波__1 小时前
二十三种设计模式(十三)--模板方法模式
java·设计模式·模板方法模式
动亦定1 小时前
微服务中如何保证数据一致性?
java·数据库·微服务·架构