单例模式学习笔记

今天想把工作和生活中接触到的一些设计模式总结一下,所以就有了写篇笔记类型文章的想法。下面我就写一下单例设计模式。我是做android开发的,所以思想可能和后端的思想不一样。

一,单例设计模式的意义

单例模式,就是应用运行时,如果需要某一个单例模式的类的对象时,这个对象只能有一个,不能有多个,即不能重复创建。这样可以减少对象创建的开销,提高应用性能。
代码编写思想:构造方法私有,使外界不能使用new来创建对象;提供一个静态方法,返回一个实例对象。

二,单例模式的几种写法

1 ,饿汉式写法

// 单例模式 (饿汉式,不存在多线程同步问题,
//但是假如这个类被加载时,我们并没有使用它的实例对象,
//那么在内存中instance对象就是无用的创建)
public class Singleton1 {
private Singleton1() {
}

private static Singleton1 instance = new Singleton1();

public static Singleton1 getInstance() {
    return instance;
    }
}

2 ,懒汉式写法第一种

/**
 * 单例模式(懒汉式,线程不安全)
 */
public class Singleton2 {

private Singleton2() {
}

private static Singleton2 instance = null;

public static Singleton2 getInstance() {
    if (instance == null) {
        instance = new Singleton2();
    }
    return instance;
    }
}   

3 ,懒汉式写法第二种

/**
     * 单例模式(懒汉式,线程安全,效率比2低)
     *
     */
public class Singleton3 {
    private Singleton3() {
    }

private static Singleton3 instance = null;

// 给方法加锁,避免在多线程访问的时候重复初始化。
//但是在这个方法被频繁调用时,效率较低
public static synchronized Singleton3 getInstance() {
    if (instance == null) {
        instance = new Singleton3();
    }
    return instance;
    }
}

4 ,懒汉式写法第三种

/**
 * 单例模式(懒汉式,线程安全,效率比3高)
 */
public class Singleton4 {
    private Singleton4() {
}

private static Singleton4 instance = null;

public static Singleton4 getInstance() {
    if (instance == null) {
        // 在此处加锁,只有在对象实例不存在时,才同步代码块,
        //保证多线程访问时对象在第一次被创建后不再被重复创建。
        // 效率比在方法上加锁要高一些
        synchronized (Singleton4.class) {
            if (instance == null) {
                instance = new Singleton4();
            }
        }
    }
    return instance;
    }
}   

5 ,对于最后一种懒汉式写法,好像说也有一些问题,搜了搜网上的相关资料,看有一种写法是在4的写法上把instance对象用volatile修饰下。

// volatile修饰的变量在线程每次使用的时候都会读取变量修改后的最后的值
// volatile很容易被误用,用来进行原子性操作
private static volatile Singleton5 instance = null;
三,总结

上面写了共计五种单例模式的写法,其中饿汉式一种,懒汉式四种。单例模式在代码编写方面大名鼎鼎,面试什么的好像提问几率很高,不过这个好像也是以前的事了,最近一段时间面试问的问题好像都更深了。写了写单例模式,忽然想不起我们项目中那里用到了单例模式,翻了翻代码,看到好像只有User类用到了,用的还是饿汉式。好吧,记个笔记,以谋将来。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值