单例模式与多线程

  1. 什么是单例模式?
    单例模式就是保证一个应用程序在整个声明周期内,只有一个实例对象。

  2. 单例模式的实现方式有哪些?
    ① 饿汉式
    所谓饿汉式,就是在类使用的时候就已经创建好对象,即立即加载。常见的实现办法就是直接new一个对象。
    优点:在多线程环境下是安全的。
    缺点:没有调用方法之前就加载创建对象,会占用内存空间
    ② 懒汉式
    所谓饿汉式,就是在使用的时候才调用getInstance()方法创建对象,即延时加载。
    优点:只有调用getInstance()方法时才创建对象,不会占用内存。
    缺点:在多线程环境下是不安全的。
    解决方法有以下四种:
    ⑴ 将getInstance()方法声明为synchronized方法
    特点:运行效率低下,下一个线程要想取得对象,必须等上一个线程释放锁之后,才可以继续执行。
    ⑵将⑴中的同步方法,改为同步代码块实现
    特点:运行效率同样低
    ⑶ 针对重要代码进行单独同步
    如:

    synchronized(类名.class){
    实例=new 类名();
    }
    特点:效率大幅提高,但是,多线程环境下,还是无法解决同一个实例对象的结果
    ⑷使用DCL双检查锁机制
    即用voltile声明实例对象,用synchronized对重要代码进行单独同步。这就是我们所谓双重检验锁方法。
    特点:在多线程下推荐使用的方法。
    ③ 使用静态内部类实现单例模式
    就是将创建对象的操作单独放在一个静态内部类中

    private static class myHander{
    private static MyObject myobject=new MyObject();
    }
    特点:同样可以达到双重检验锁的效果。
    但是,该方法遇到序列化对象时,就会得到多例结果。为了保证得到单例,需要在反序列化中使用readResolve()方法。
    ④ 使用static代码块实现单例模式

    public class MyObje{
    private static MyObj instance=null;
    private MyObj(){
    }
    static{
    instance=new MyObj();
    }
    public static MyObj getInstance(){
    return instance;
    }
    }
    ⑤使用enu枚举数据类型实现单例模式

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值