【JAVA】多线程案例之单例模式

1.饿汉单例

2.懒汉单例

在写代码时会根据具体开发情况来选择单例模式,单例模式是什么东东?

简单来说单就是一个进程中只创建一个实例,所以叫做单例模式

单例模式的实现有两个选择,一个是“饿汉”单例,一个是了“懒汉”单例

懒这个字在程序中并不是贬义词,让程序懒,就是让程序到达对应的时刻再去工作,而饿汉代表着很急迫,刚开始就把很多没必要的工作做了,这样可能会导致占用资源,效率不高。

下面先介绍饿汉版本的单例模式

//单例类,这个类只能有一个实例
class Singleton{

    //这是饿汉模式,在类创建的时候就创建了实例

    private static Singleton instance = new Singleton();//这是这个类里的唯一实例

    //在类外想调用singleton,给一个接口
    public static Singleton getInstance(){
        return instance;
    }

    //防止被new
    private Singleton(){
        //这个操作强制其他代码new这个实例
    }
}

public class singletonDemo {
    public static void main(String[] args) {
        //想要搞单例,那就不能再继续new一个对象,所以要在单例类中搞一个私有的构造方法,防止在单例类外被new
        //Singleton singleton = new Singleton();
        //如果想调用单
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 饿汉式——线程安全的单例模式 这是一种最简单的实现方式。在类加载的时候就创建了实例,因此保证了线程安全。缺点是无论是否需要这个对象,都会在程序启动时被加载,从而浪费了一定的空间。 ```java public class Singleton { //创建 Singleton 的一个对象 private static Singleton instance = new Singleton(); //让构造函数为 private,这样该类就不会被实例化 private Singleton(){} //获取唯一可用的对象 public static Singleton getInstance(){ return instance; } } ``` 2. 懒汉式——线程不安全的单例模式 这种方式虽然达到了按需初始化的目的,但却带来了线程不安全的问题,如果多个线程同时调用 `getInstance()` 方法,那么就会创建多个实例。 ```java public class Singleton { private static Singleton instance; private Singleton(){} public static Singleton getInstance(){ if(instance == null) { instance = new Singleton(); } return instance; } } ``` 3. 懒汉式——线程安全的单例模式 使用 `synchronized` 关键字可以解决线程安全问题,但是这样每次调用 `getInstance()` 方法都会进行同步,影响程序的性能。 ```java public class Singleton { private static Singleton instance; private Singleton(){} public static synchronized Singleton getInstance() { if(instance == null) { instance = new Singleton(); } return instance; } } ``` 4. 双重校验锁——线程安全的单例模式 这是一种比较好的实现方式,使用了双重校验锁,既保证了线程安全,又实现了按需初始化,同时也减少了同步开销。 ```java public class Singleton { private volatile static Singleton instance; private Singleton(){} public static Singleton getInstance() { if(instance == null) { synchronized (Singleton.class) { if(instance == null) { instance = new Singleton(); } } } return instance; } } ``` 5. 静态内部类——线程安全的单例模式 使用静态内部类的方式可以在调用 `getInstance()` 方法时才真正创建对象,达到最佳的按需初始化效果,并且也保证了线程安全。 ```java public class Singleton { private Singleton(){} private static class SingletonHolder{ private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance(){ return SingletonHolder.INSTANCE; } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值