A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 菊花爆满山 中级黑马   /  2016-7-23 23:41  /  651 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package com.itheima.demo;

  2. import java.io.FileInputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.ObjectInputStream;
  7. import java.io.ObjectOutputStream;
  8. import java.io.Serializable;

  9. import org.junit.Test;

  10. /**
  11. * 单例设计模式有几种实现方式:
  12. * 首先是关于单例设计模式的定义:
  13. * 所谓单例就是在堆内存中只存在该类的一个实例
  14. * 优点:提高程序的性能,减少了内存的开销
  15. * 缺点:多线程并发问题
  16. *
  17. * @author Administrator
  18. *
  19. */
  20. public class Demo1 {
  21.         @Test
  22.         public void  test() {
  23.                 //饿汉式和懒汉式、静态内部类方式的测试
  24.                 Single3 instance1 = Single3.getInstance();
  25.                 Single3 instance2 = Single3.getInstance();
  26.                 System.out.println(instance1==instance2);
  27.         }
  28.         /**
  29.          * 分析 对于以饿汉式和懒汉式、静态内部类方式需要注意序列化的问题
  30.          * 处理方法是:在单例类中加上readResovle方法,那么readObject就会去调用readResovle方法
  31.          * @throws IOException
  32.          * @throws FileNotFoundException
  33.          */
  34.         @Test
  35.         public void  test2() throws Exception {
  36.                 Single3 instance1 = Single3.getInstance();
  37.                 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d:/temp/test.txt"));
  38.                 oos.writeObject(instance1);
  39.                
  40.                 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:/temp/test.txt"));
  41.                 Object readObject = ois.readObject();
  42.                 System.out.println(instance1==readObject);
  43.         }
  44.         @Test
  45.         /**
  46.          * 枚举的方式不会出现线程并发和序列化的问题
  47.          */
  48.         public void test3() {
  49.                 //枚举方式的测试
  50.                 Single4 single1 = Single4.single;
  51.                 Single4 single2 = Single4.single;
  52.                 System.out.println(single1==single2);
  53.         }
  54.        
  55. }
  56. /**
  57. * 饿汉式
  58. * @author Administrator
  59. *
  60. */
  61. class Single {
  62.         private final static Single single = new Single();
  63.         private Single(){}//私有构造方法
  64.         public static Single getInstance() {
  65.                 return single;
  66.         }
  67. }
  68. /**
  69. * 懒汉式  存在线程安全问题

  70. class Single2 {
  71.         private static Single2 single2 = null;
  72.         private Single2(){}//私有构造方法
  73.         public static Single2 getInstance() {
  74.                 if(single2==null) {
  75.                         single2 = new Single2();
  76.                 }
  77.                 return single2;
  78.         }
  79. }
  80. */
  81. /**
  82. * 懒汉式  对线程安全问题的解决
  83. */
  84. class Single2 {
  85.         private static Single2 single2 = null;
  86.         private Single2(){}//私有构造方法
  87.         public static Single2 getInstance() {
  88.                 if(single2==null) {
  89.                         //加锁  同步代码块
  90.                         synchronized (Single2.class) {
  91.                                 //线程安全机制耗费资源  这里再加一次判断可以提高效率
  92.                                 if(single2==null) {
  93.                                         single2 = new Single2();
  94.                                 }
  95.                         }
  96.                 }
  97.                 return single2;
  98.         }
  99. }
  100. /**
  101. * 静态内部类的方式实现单例
  102. */
  103. class Single3 implements Serializable{
  104.         private static final long serialVersionUID = 1L;
  105.         private Single3(){}
  106.         public static Single3 getInstance() {
  107.                 return SingleDemo.single;
  108.         }
  109.         private static class SingleDemo {
  110.                 private final static Single3 single = new Single3();
  111.         }
  112.         //处理反序列化导致的两个实例的问题
  113.         public Object readResolve() {
  114.                 return SingleDemo.single;
  115.         }
  116. }
  117. /**
  118. * 枚举的方式
  119. */
  120. enum Single4 {
  121.         single;
  122. }
复制代码

1 个回复

正序浏览
棒棒哒!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马