单例模式的设计与实现

#单例模式 (系统内存中该类只存在一个 实例对象,节省了系统资源)

# 一:饿汉式(线程安全,直接创建对象,可能会消耗空间) 
	* 构造方法私有:private 修饰
	* 直接创建一个实例对象:private修饰(或则再同步代码块中进行对象的创建)
	* 通过一个方法,进行实例对象的返回
	* 
# 二:懒汉式
	* 构造方法私有化:private修饰
	* 先进行对象是否为null,再进行对象的创建
	* 通过方法,将实例对象进行返回
	
   (1)直接使用if(instance==null)进行判断,线程不安全,有多个线程进来时
class Lazy1 {

    private Lazy1() {

    }

    private static Lazy1 lazy;

    /**
     * 当多个线程进入时 if(lazy==null) 会产生线程不安全的
     * @return
     */
    public static Lazy1 getIns() {
        if (lazy == null) {
            lazy = new Lazy1();
        }
        return lazy;
    }
 }
   (2)用synchronized对 返回实例的方法进行修饰(降低了程序的效率)
 public static synchronized Lazydemo2 getIns() {
        if (lazy == null) {
            lazy = new Lazydemo2();
        }
        return lazy;
    }
	(3)使用双重检查,volatile对实例对象进行修饰(可以修改),在返回实例对象时用synchronized修饰,两次进行 实例对象 null的判断

		`//volatile 使得实例对象 具有可见性
 private static volatile DoubleCheck Instance;

    public static DoubleCheck getInstance() {

        if (Instance == null) {
            /*
            锁对象:整个类
            synchronized:线程安全
            再一次进行判断:增加了程序的效率
             */
            synchronized (DoubleCheck.class) {
                if (Instance == null) {
                    Instance = new DoubleCheck();
                }
            }
        }

        return Instance;
    }
		
# 使用静态内部类的方式
	* 内部类用static 修饰,只会加载一次(提高了程序的效率)
	* 在静态内部类中 创建实例化对象 
			* 
class LazyInner {
		
		    private LazyInner() {
		    }
		
		    //用静态 static修饰 表示只会加载一次
		    private static class LazyInnerDemo {
		        private static final LazyInner lazyInner = new LazyInner();
		    }
		
		    public static LazyInner getIns() {
		        return LazyInnerDemo.lazyInner;
		    }
		
		}
# 使用枚举类型
	* enum 类名{
	* 属性
	}
enum Singletons {
	    //定义一个属性
	    Instance;
	
	}
	  Singletons singletons = Singletons.Instance;

单例模式 的创建中推荐使用

* 枚举类型
* 静态内部类
* 懒汉式(双重检查 volatile 修饰 实例对象 synchronized对返回实例方法进行加锁,两次使用 if(==null))进行双重判断
* 饿汉式 (线程安全,占用内存空间)
*

单例模式在jdk中的使用

* java.lang.Runtime 使用的是单例模式(饿汉式)
 public class Runtime {
    	private static Runtime currentRuntime = new Runtime();

        public static Runtime getRuntime() {
        return currentRuntime;
  		  }

 	     private Runtime() {}

#单例模式的使用场景
* 需要频繁的进行创建对象何销毁对象,eg:工具类对象,避免了创建对象时的耗时操作,或消耗的资源过多的情况。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值