首页 > 学院 > 开发设计 > 正文

单例设计模式笔记

2019-11-06 08:22:01
字体:
来源:转载
供稿:网友

单例模式类似计划生育,其保证类仅有一个实例,且对外提供访问该实例的接口。 所有类都有构造器,若不显示定义,则系统提供默认的构造器;若显示定义,则默认的构造器失效。 使用常规代码实现单例会导致代码臃肿,后期debug和修改时工作量加大。

public class Singleton { PRivate static Singleton obj; //obj设为static private Singleton() { //构造器设为private } public static Singleton getInstance() { //给外部提供一个单例接口 if (obj == null) obj = new Singleton(); return obj; }}

实用类:仅仅只是静态方法和静态属性的集合,没有实例对象,如Math类。 为保证单例模式在多线程下的安全性,有两种解决方案,饿汉式和懒汉式(形象的比喻)。

饿汉式(线程安全,代码简洁,空间效率低):

public class Singleton { private static Singleton obj = new Singleton(); //obj设为static private Singleton() { //构造器设为private } public static Singleton getInstance() { //给外部提供一个单例接口 return obj; }}

懒汉式(延迟实例对象创建时间,只有在需要时才创建):线程等待时有一定的时间开销。

直接对接口加锁:效率低,保证线程安全。

public class Singleton { private static Singleton obj; //obj设为static private Singleton() { //构造器设为private } public synchronized static Singleton getInstance() { //给外部提供一个单例接口 if (obj == null) obj = new Singleton(); return obj; }}

双重锁定:效率高,保证线程安全

public class Singleton { private static Singleton obj; //obj设为static private static Object lock = new Object(); //创建一个对象,该对象作为锁使用 private Singleton() { //构造器设为private } public static Singleton getInstance() { //给外部提供一个单例接口 if (obj == null) { //只有对象还未创建时,才进行加锁,否则直接返回对象,无需加锁 synchronized (lock) { if (obj == null) obj = new Singleton(); } } return obj; }}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表