前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java|深入研究Java单例设计模式

Java|深入研究Java单例设计模式

作者头像
算法与编程之美
发布2020-05-25 16:59:49
3480
发布2020-05-25 16:59:49
举报

简介

看到标题可能有人会问什么是单例模式呢?

在程序设计过程中,会遇到这么一个问题:当设计好一个类之后,会发现可以在别的类中调用类的构造方法实例化一个对象。并且通过实例化对象调用类中的属性和方法。

那么问题来了,如果存在某个类,这个类对于程序来说只需要产生一个类的时候,并且需要强制要求此类只能产生一个对象应该怎么办?这个时候就可以用到单例设计模式。所谓单例设计就是构造方法私有化,在类中实例化对象,通过类的静态方法调用类中的属性和方法。

其中单例设计又分为两种:

1.饿汉式:在系统加载类的时候就会自动提供实例对象。

2.懒汉式:在第一次使用的时候进行实例处理。

饿汉式

饿汉式单例设计模式就是在系统加载类的时候就会自动提供实例对象

那么如何才能实现饿汉式单例设计呢?可以将对象设置成一个静态的属性,再通过一个静态方法来获得这个属性。因为同一个类中静态属性只能静态访问。

下面来看看具体例子:


public  class Singleton {

    private static final Singleton SINGLETON  = new Singleton();

private Singleton() {

System.out.println("饿汉式单例设计构造方法");

 

    }

    public static Singleton getSingloten(){

        return SINGLETON;

    }

    public void print(){

        System.out.println("饿汉式单例设计");

    }

}

这就是一个单例设计的例子。在类中静态实例化了一个对象,并且有一个静态方法可以获得此对象。当需要用到此类时,直接通过类名就可以调用静态方法得到对象。

懒汉式

懒汉式单例设计是在第一次使用的时候进行实例处理。和饿汉式设计的区别就在于懒汉式设计是在调用静态方法的时候才会产生实例化对象,而不是系统直接提供。下面来看看具体事例:

通过这种单例设计我们就能达到只能得到一个对象的目的,但是这种懒汉式单例设计还是存在一个问题。是什么呢?来看看这个例子。

当使用多线程的时候调用静态方法获得对象的时候,运行结果说明并不是只产生一个对象,而是产生了三个对象。

运行结果如下图所示:

通过分析发现,在多线程中访问静态方法时,线程是同时访问的,并且同时判断对象是否为空。三个线程同时得到对象为空的结果,所以产生了三个对象。那么怎么去解决呢?可以通过线程的同步操作来实现这个操作。

实现方法如下:

同步操作就是当有一个线程在操作的时候,其他的线程就等待,这样就避免了线程同时获得对象为空的结果。但是这样加同步操作好像也不太合适,因为需要做的就只是同步操作判断对象是否为空的部分,所以将整个方法设为同步操作有点过于草率。因此还可以这样优化一下:

public static Singleton getSingloten(){ if (SINGLETON == null){ synchronized (Singleton.class) { if (SINGLETON == null) { SINGLETON = new Singleton(); } } } return SINGLETON; }

来看看运行结果:

构造方法确实是只被调用了一次,这样也达到了单例设计只产生一个对象的目的。有了这样的设计,单例设计才算是完美。

END

主 编 | 张祯悦

责 编 | 陶兴池

where2go 团队

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法与编程之美 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档