Java中的单例模式

1,什么是单例模式

有时候我们只需要一个类的唯一对象,而不会创建更多的对象时候,就需要单例模式了。

2,单例模式的好处

单例模式有很多好处,首先可以避免对象反复的创建,从而减少了内存空间的消耗,更重要的是如果在整个程序中

需要一个全局管理的对象,而且这个对象只有一个那么单例模式就是一个很好的选择了

3,单例模式如何写

单例模式有很多种写法,我们来了解一下各自的区别

//饿汉式

/*

从代码中我们看到,类的构造函数定义为private的,保证其他类不能实例化此类,然后提供了一个静态实例并返

回给调用者。饿汉模式是最简单的一种实现方式,饿汉模式在类加载的时候就对实例进行创建,实例在整个程序周期都

存在。它的好处是只在类加载的时候创建一次实例,不会存在多个线程创建多个实例的情况,避免了多线程同步的问

题。它的缺点也很明显,即使这个单例没有用到也会被创建,而且在类加载之后就被创建,内存就被浪费了。

*/

public class Singleton{

private static Singleton instance = new Singleton();

private Singleton(){}

public static Singleton newInstance(){

return instance;

}

}
//懒汉式

/*

懒汉模式中单例是在需要的时候才去创建的,如果单例已经创建,再次调用获取接口将不会重新创建新的对象,而是

直接返回之前创建的对象。如果某个单例使用的次数少,并且创建单例消耗的资源较多,那么就需要实现单例的按需创

建,这个时候使用懒汉模式就是一个不错的选择。

*/

public class Singleton{

private static Singleton instance = null;

private Singleton(){}

public static Singleton newInstance(){

if(null == instance){

instance = new Singleton();

}

return instance;

}

}

 

/*

但是这里的懒汉模式并没有考虑线程安全问题,在多个线程可能会并发调用它的getInstance()方法,导致创建多个实

例,因此需要加锁解决线程同步问题,实现如下。

*/

public class Singleton{

private static Singleton instance = null;

private Singleton(){}

public static synchronized Singleton newInstance(){

if(null == instance){

instance = new Singleton();

}

return instance;

}

}
//双重校验锁

/*

加锁的懒汉模式看起来即解决了线程并发问题,又实现了延迟加载,然而它存在着性能问题,依然不够完美。

synchronized修饰的同步方法比一般方法要慢很多,如果多次调用getInstance(),累积的性能损耗就比较大了。因此

就有了双重校验锁,先看下它的实现代码。

*/

public class Singleton {

private static Singleton instance = null;

private Singleton(){}

public static Singleton getInstance() {

if (instance == null) {

synchronized (Singleton.class) {

if (instance == null) {

instance = new Singleton();

}

}

}

return instance;

}

}

4,总结

  • 实际上单例的写法还有静态内部类,和枚举的写法,但是实际开发中很少有人这么去写
  • 单例模式有多种方式,选择最合适的方式即可
  • 在开发中常用的写法是双重校验锁的方式
  • 单例模式适合全局只需要一个对象的场景

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值