单例设计模式.doc_第1页
单例设计模式.doc_第2页
单例设计模式.doc_第3页
单例设计模式.doc_第4页
单例设计模式.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在Java 的单例模式中,有两种实现方式,懒汉式与饿汉式。 单例模式实现之饿汉式|-单例类Songleton /* 单例模式实现之一饿汉式* * 一开始就创建Singleton的对象并实例化* */class Singleton / 创建一个Signleton实例对象,用来存储创建好的实例 private static Singleton singleton = new Singleton(); / 将构造方法进行私有化 private Singleton() / 待执行代码 / 获取Sington实例对象 public static Singleton getInstance() / 返回实例对象 return singleton; 复制代码|-测试类 public class SingletonDemo public static void main(String args) / 创建Singleton实例对象 Singleton singleton01 = Singleton.getInstance(); Singleton singleton02 = Singleton.getInstance(); / 判断两个实例对象是否是同一个 if (singleton01 = singleton02) /相同打印The Same Object! System.out.println(The Same Object!); else /不相同打印The DifferentObject! System.out.println(The Different Object!); 复制代码|-测试结果 The Same Object!复制代码从测试的结果可以看出,获得Singleton对象是同一对象。|-饿汉式程序调用顺序图 单例模式实现之懒汉式|-单例类Songleton /* 单例模式实现之一懒汉式* * 当需要实例对象的时候再去生成对象进行实例化* */class Singleton / 声明一个Signleton变量,用来存储创建好的实例 private static Singleton singleton = null; / 将构造方法进行私有化 private Singleton() / 待执行代码 / 获取Sington实例对象 public static Singleton getInstance() / 判断singleton 是否为null,是的话实例化 if (null = singleton) singleton = new Singleton(); / 返回实例对象 return singleton; 复制代码|-测试类与测试结果 和上面单例模式实现之饿汉式的一样,达到了生成同一个Singleton的对象。|-懒汉式程序调用顺序图以上两种实现方式均单线程的情况下,但是在多线程的情况下,懒汉式就可能生成不止一个Singleton对象。如下实例 单例模式实现之懒汉式(多线程)|-单例类Songleton /* 单例模式实现之一懒汉式* * 当需要实例对象的时候再去生成对象进行实例化* * 但时在多线程的时候,生成的可能就不是一个对象了* */class Singleton / 声明一个Signleton变量,用来存储创建好的实例 private static Singleton singleton = null; / 将构造方法进行私有化 private Singleton() / 待执行代码 / 获取Sington实例对象 public static Singleton getInstance() / 判断singleton 是否为null,是的话 实例化 if (null = singleton) /捕捉异常 try /对线程进行休眠,休眠时间是随机生成的 Thread.sleep(long)(Math.random() * 1000); singleton = new Singleton(); catch (InterruptedException e) e.printStackTrace(); / 返回实例对象 return singleton; 复制代码加入了Thread.sleep()方法,让线程睡眠一段时间。|-线程类 /实现Runnable接口的线程类class SingletonThread implements Runnable /覆写Runnable接口中的run()方法 public void run() /打印获取的Singleton对象地址信息 System.out.println(Singleton.getInstance(); 复制代码用于获取Singleton的对象。|-测试类 public class SingletonDemo public static void main(String args) / 创建两个匿名线程对象,并启动 new Thread(new SingletonThread().start(); new Thread(new SingletonThread().start(); 复制代码|-测试结果 com.shengsiyuan.javalinux.singleton03.Singleton69b332com.shengsiyuan.javalinux.singleton03.Singleton173a10f复制代码结果显示生成的Singleton对象的内存地址不一样,即不是同一对象。说明在多线程的情况下单例模式的懒汉式不能达到生成同一对象的目的。 单例模式实现之懒汉式改进(多线程)使用synchronized修饰方法对Singleton类进行改进,对getInstance()进行同步加锁,即使用synchronized关键字。修改:单例类Songleton /* 单例模式实现之一懒汉式* * 当需要实例对象的时候再去生成对象进行实例化* * 多线程的时候,对生成实例的getInstance()方法进行加锁* */class Singleton / 声明一个Signleton变量,用来存储创建好的实例 private static Singleton singleton = null; / 将构造方法进行私有化 private Singleton() / 待执行代码 / 对此方法进行加锁,实现同步,来获取Sington实例对象 public static synchronized Singleton getInstance() / 判断singleton 是否为null,是的话 实例化 if (null = singleton) / 捕捉异常 try / 对线程进行休眠,休眠时间是随机生成的 Thread.sleep(long) (Math.random() * 1000); singleton = new Singleton(); catch (InterruptedException e) e.printStackTrace(); / 返回实例对象 return singleton; 复制代码|-测试结果 com.shengsiyuan.javalinux.singleton04.Singleton1b67f74com.shengsiyuan.javalinux.singleton04.Singleton1b67f74复制代码此时打印的结果是一致的,说明生成的Singleton对象是同一对象。 单例模式实现之懒汉式改进(多线程)使用synchronized代码块 在getInstance()方法中使用同步代码块进行加锁。 /* 单例模式实现之一饿汉式* * 当需要实例对象的时候再去生成对象进行实例化* * 多线程的时候,对生成实例的getInstance()方法进行加锁* */class Singleton / 声明一个Signleton变量,用来存储创建好的实例 private static Singleton singleton = null; / 将构造方法进行私有化 private Singleton() / 待执行代码 / 获取Sington实例对象 public static Singleton getInstance() / 判断singleton 是否为null,是的话实例化 if (null = singleton) / 捕捉异常 try / 对线程进行休眠,休眠时间是随机生成的 Thread.sleep(long) (Math.random() * 1000); /使用同步代码块,线程安全的创建实例 synchronized (Singleton.class) /再次检查实例是否存在,不存在的话在创建实例 if (null = singleton) singleton = new Singleton(); catch (InterruptedException e) e.printStackTrace(); / 返回实例对象 return singleton

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论