java创建单例模式

java创建单利模式

1、为什么要创建单利模式?

因为单例模式保证一个类中只存在一个实例,有利于节省内存,有利于java垃圾回收

2、 常见三种单例模式的创建

1).懒汉式单例模式
public class People {
public synchronized static People getInstance(){
        if(instance==null){
            instance=new People();
        }
        return instance;
    }
    private People(){

    }

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

这种写法在getInstance()方法中加入了synchronized锁。能够在多线程中很好的工作,而且看起来它也具备很好的lazy loading,但是效率很低(因为锁),并且大多数情况下不需要同步。

2).饿汉式单例模式
public class People {
  private static People instance=new People();
    private People(){

    }
    public  static People getInstance(){
        return instance;
    }
	private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    }

这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化,这时候初始化instance显然没有达到lazy loading的效果。

3).静态类部类模式
public class People {
 private static class Instance{
        private static People instance=new People();

    }
    public  static People getInstance(){
        return Instance.instance;
    }



    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    }

这种方式同样利用了classloder的机制来保证初始化instance时只有一个线程,它跟第二种不同的是(很细微的差别):第二种是只要Singleton类被装载了,那么instance就会被实例化(没有达到lazy loading效果),而这种方式是Singleton类被装载了,instance不一定被初始化。因为SingletonHolder类没有被主动使用,只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,从而实例化instance。想象一下,如果实例化instance很消耗资源,我想让他延迟加载,另外一方面,如果不希望在Singleton类加载时就实例化,因为不能确保Singleton类还可能在其他的地方被主动使用从而被加载,那么这个时候实例化instance显然是不合适的。这个时候,这种方式相比第三方法就显得更合理。

测试类
public class PeopleTest {
public static void main(String[] args){
People p1=People.getInstance();
        p1.setName("张三");
        People p2=People.getInstance();
        p2.setName("李四");
        System.out.println(p1.getName());
        System.out.println(p2.getName());
   }
}

输出结果
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,单例模式用于确保一个只有一个实例,并提供一个全局访问点来获取该实例。以下是创建Java单例模式的常见方法: 1. 饿汉式: ```java public class Singleton { private static Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } } ``` 在饿汉式中,实例在类加载时就被创建,因此在多线程环境下也能保证只有一个实例。 2. 懒汉式(线程不安全): ```java public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } ``` 懒汉式在第一次调用getInstance()方法时才创建实例,但在多线程环境下可能会创建多个实例。 3. 懒汉式(线程安全,使用synchronized关键字): ```java public class Singleton { private static Singleton instance; private Singleton() {} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } ``` 使用synchronized关键字可以确保在多线程环境下只创建一个实例,但会影响性能。 4. 双重检查锁定(Double-Checked Locking): ```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; } } ``` 双重检查锁定在多线程环境下保证只创建一个实例,并且在实例创建后不会每次都加锁,提高了性能。 以上是几种常见的Java单例模式创建对象的方法。每种方法都有其优缺点,选择适合自己需求的方法进行使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值