单例模式

1.懒汉式

public class SingletonExample1{

private SingletonExample1(){}

private static SingletonExample1 instance= null;

public static SingletonExample1 getSingleton(){

if(instance == null){

instance = new SingletonExample1();

}

return instance;

}

}

2.饿汉式

public class SingletonExample2{

private SingletonExample2(){}

private static SingletonExample2 instance = new SingletonExample2();

public static SingletonExample2 getSingleton(){

return instance;

}

}

3. 懒汉式改进,加锁

public class SingletonExample3{

private SingletonExample3(){}

private static SingletonExample3 instance =null;

public static synchronized SingletonExample3 getSingleton(){

if(instance == null){

instance = new SingletonExample3();

}

return instance;

}

}

4. 懒汉式,双重校验锁

public class SingletonExample4{

private SingletonExample4(){}

private static SingletonExample4 instance = null;

public static SingletonExample4 getSingleton(){

if(instance== null){

synchronized(SingletonExample4.class){

if(instance== null){

instance = new SingletonExample4();

}

}

}

return instance;

}

}

5. 懒汉式+双重校验锁+volatile

public class SingletonExample5{

private SingletonExample5(){}

private static volatile SingletonExample5 instance= null;

public static SingletonExample5 getSingleton(){

if(instance==null){

synchronized(SingletonExample5 class){

if(instance==null){

instance = new SingletonExample5();

}

}

return instance;

}

}

}

6. 饿汉式采用静态代码块

public class SingletonExample6{

private SingletonExample6(){ }

private static SingletonExample6 instance = null;

static {

instance = SingletonExample6();

}

public static SingletonExample6 getSingleton(){

return instance;

}

}

前面已经写了6种,那有没有不会出现并发问题,同时又是推荐的写法呢?答案是有的。采用枚举的方式

7.采用枚举方式

public class SingletonExample7{

private SingletonExample7(){ }

private static getSingleton(){

return Singleton. INSTANCE. getInstance();

}

public enum Singleton(){

INSTANCE;

private static SingletonExample7 instance=null;

Singleton(){

instance = new SingletonExample7();

}

public SingletonExample7 getInstance(){

return instance;

}

}

}

同时单例模式使用的场景:

通常对于需要全局唯一的对象时,此时就需要考虑了。比如我们常用Spring中的ApplicationContext中getBean方法就是单例模式的。通常情况下,其首先会到缓存中去找,看有没有,采用的是饿汉式的方式,如果有的话,则直接加载,如果没有,首先创建,然后对其进行缓存,保证对象的唯一性。而XmlBeanFactory中getBean则是采用原型模式。

本文分享自微信公众号 - 后端技术学习(gh_9f5627e6cc61),作者:路行的亚洲

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Dubbo调用流程学习总结

    首先我们知道Dubbo是一个RPC框架,因此解决的问题是服务治理,这个治理是解决服务注册和调用列表的维护治理,产生注册中心维护服务列表和更新,同时方便远程调用和...

    路行的亚洲
  • ThreadPoolExecutor源码学习

    但点进去看newSingleThreadExecutor可以看到其会调用ThreadPoolExecutor里面的线程。因此有必要研究ThreadPoolExe...

    路行的亚洲
  • RocketMQ学习六-消息存储

    消息存储主要做的事情:首先将消息放入,然后进行消息追加,进行统计,然后进行刷盘操作,最后进行HA主从同步。此时的消息放入是在CommitLog中会进行转发到Co...

    路行的亚洲
  • 剑指offer__1__Singleton模式

    小结:不建议使用双重锁判定机制,单例对象、资源占用少,枚举要比饿汉好,目前用的较多的是枚举。

    用户6055494
  • Android设计模式之单例模式详解

    饿汉式 懒汉式 同步加锁 DCL双重加锁验证 静态内部类 枚举单例 饿汉式

    砸漏
  • 聊聊openjdk的BufferPoolMXBean

    java.management/java/lang/management/PlatformManagedObject.java

    codecraft
  • 聊聊openjdk的BufferPoolMXBean

    java.management/java/lang/management/PlatformManagedObject.java

    codecraft
  • Java 单例模式

    用户1180017
  • Android定时器Timer的停止和重启实现代码

    本文介绍了Android定时器Timer的停止和重启实现代码,分享给大家,具体如下:

    砸漏
  • 慕课网高并发实战(六)- 线程安全策略

    ThreadLocal 实例保存登录用户信息 (具体的业务场景,和拦截器的使用就不赘述了,大家可以购买课程详细学习)

    Meet相识

扫码关注云+社区

领取腾讯云代金券