编辑: 思念那么浓 2012-12-25

其二,如果弹出的多个窗口内 容不一致,问题就更加严重了,这意味着在某一瞬间系统资源使用情况和进程、服务等信息存 在多个状态,例如任务管理器窗口 A 显示 CPU 使用率 为10%,窗口 B 显示 CPU 使用率 为15%,到底哪个才是真实的呢?这纯属 调戏 用户,给用户带来误解,更不可取.由此可 见,确保 Windows 任务管理器在系统中有且仅有一个非常重要.除了任务管理器外,数据库连 接池、应用配置等都是使用单例的. 了解完单例模式的使用场景后,再来看看单例模式的定义. 单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整 个系统提供这个实例,这个类称为单例类,它提供全局访问的方法.单例模式是一种 对象创建型模式. 第3章Spring 快速上手 |

43 先来看一个传统的创建类的代码: /** * 描述:传统创建类实例 * @author Ay * @create 2018/1/23. */ public class Case_1 { public static void main(String[] args) { Singleton singleton = new Singleton();

Singleton singleton2 = new Singleton();

} } /** * 描述:单例类 */ class Singleton{ } 上述代码中,每次 new Singleton(),都会创建一个 Singleton 实例,显然不符合一个类只有 一个实例的要求.所以需要对上述代码进行修改,具体修改点如下: /** * 描述:单例模式实例 * @author Ay * @create 2018/1/23. */ public class Case_1 { public static void main(String[] args) { //Singleton singleton = new Singleton();

//单例 Singleton singleton = Singleton.getInstance();

} } /** * 描述:单例类(饿汉模式) */ class Singleton{

44 | Spring MVC + MyBatis 快速开发与项目实战 //step 2. 自行对外提供实例 private static final Singleton singleton = new Singleton();

//step 1.构造函数私有化 private Singleton(){} //step 3. 提供外界可以获得该实例的方法 public static Singleton getInstance(){ return singleton;

} } 单例模式的写法有很多种,上述代码是一个最简单的饿汉模式的实现方法,在类加载的时 候就创建了单例类的对象.由上述代码可知,实现一个单例模式总共有三个步骤: (1)构造函数私有化. (2)自行对外提供实例. (3)提供外界可以获得该实例的方法. 与饿汉模式相对应的还有懒汉模式,懒汉模式有延迟加载的意思,具体代码如下: /** * 描述:懒汉模式(存在多线程并发的问题,不是正确的写法) * @author Ay * @create 2018/04/14 */ class Singleton{ private static Singleton singleton = null;

private Singleton(){} public static Singleton getInstance(){ //1.判断对象是否创建 if(null == singleton){ //2.创建对象 singleton = new Singleton();

} return singleton;

} } 如果创建单例对象会消耗大量资源,那么延迟创建对象是一个不错的选择,但是懒汉模式 有一个明显的问题,就是没有考虑线程安全问题,在多线程并发的情况下,会并发调用 getInstance()方法,从而导致系统同时创建多个单例类实例,显然不符合要求.可以通过给 getInstance()方法添加锁解决该问题,具体代码如下: 第3章Spring 快速上手 |

45 /** * 描述:懒汉模式(添加 synchronized 锁) * @author Ay * @create 2018/04/14 */ class Singleton{ private static Singleton singleton = null;

private Singleton(){} public static synchronized Singleton getInstance(){ //1.判断对象是否创建 if(null == singleton){ //2.创建对象 singleton = new Singleton();

} return singleton;

} } 添加 synchronized 锁虽然可以保证线程安全,但是每次访问 getInstance()方法的时候,都会 有加锁和解锁操作,同时 synchronized 锁是添加在方法上面,锁的范围过大,而单例类是全局 唯一的,锁的操作会成为系统的瓶颈.因此,需要对代码再进行优化,由此引出了 双重校验 锁 的方式,具体代码如下: /** * 描述:双重校验锁(指令重排问题) * @author Ay * @create 2018/04/14 */ class Singleton{ private static Singleton singleton = null;

下载(注:源文件不在本站服务器,都将跳转到源网站下载)
备用下载
发帖评论
相关话题
发布一个新话题