经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
设计模式之单例模式
来源:cnblogs  作者:冰乐  时间:2019/9/20 9:49:41  对本文有异议

单例模式的好处:

  单例模式的好处就是单例,就是去阿奴唯一的一个实例,应对一些特殊情况,比如数据库连接池(内置了资源)全局唯一奥玛生成器,单例可以避免重复创建,但是也会常驻内存,除非真的有必要,否则不要用单例模式。

单例模式:

  1、够高函数私有化,避免别人还去new

  2、公开的静态方法提供对象实例

  3、初始化一个静态字段用于返回,保证全局都是这一个。

  1. /// <summary>
  2. /// 单例类:一个构造对象很耗时耗资源类型
  3. /// 懒汉式单例模式
  4. /// </summary>
  5. public class Singleton
  6. {
  7. /// <summary>
  8. /// 构造函数耗时耗资源
  9. /// </summary>
  10. private Singleton()
  11. {
  12. }
  13. /// <summary>
  14. /// 3 全局唯一静态 重用这个变量
  15. /// </summary>
  16. private static volatile Singleton _Singleton = null;
  17. /// <summary>
  18. /// 2 公开的静态方法提供对象实例
  19. /// </summary>
  20. /// <returns></returns>
  21. public static Singleton CreateInstance()
  22. {
  23. _Singleton = new Singleton();
  24. return _Singleton;
  25. }
  26. }

可以用以object.ReferenceEquals来验证创建的实例是不是同一个

  1. Singleton singleton1 = Singleton.CreateInstance();
  2. Singleton singleton2 = Singleton.CreateInstance();
  3. Singleton singleton3 = Singleton.CreateInstance();
  4. Console.WriteLine(object.ReferenceEquals(singleton1, singleton2));
  5. Console.WriteLine(object.ReferenceEquals(singleton3, singleton2));

在多线程下,同事开启5个线程去创建呢?

  1. for (int i = 0; i < 5; i++)
  2. {
  3. Task.Run(() =>//启动线程完成--5个线程并发执行,同时去执行这个方法
  4. {
  5. Singleton singleton1 = Singleton.CreateInstance();
  6. singleton1.Show();
  7. });
  8. }

这里就会出现多线程的问题,下面来解决多线程面临的问题。

  1. /// <summary>
  2. /// 单例类:一个构造对象很耗时耗资源类型
  3. /// 懒汉式单例模式
  4. /// </summary>
  5. public class Singleton
  6. {
  7. /// <summary>
  8. /// 构造函数耗时耗资源
  9. /// </summary>
  10. private Singleton()
  11. {
  12. long lResult = 0;
  13. for (int i = 0; i < 10000000; i++)
  14. {
  15. lResult += i;
  16. }
  17. Thread.Sleep(2000);
  18. Console.WriteLine("{0}被构造一次", this.GetType().Name);
  19. }
  20. /// <summary>
  21. /// 3 全局唯一静态 重用这个变量
  22. /// </summary>
  23. private static volatile Singleton _Singleton = null;
  24. //volatile 促进线程安全 让线程按顺序操作
  25. private static readonly object Singleton_Lock = new object();
  26. /// <summary>
  27. /// 2 公开的静态方法提供对象实例
  28. /// </summary>
  29. /// <returns></returns>
  30. public static Singleton CreateInstance()
  31. {
  32. if (_Singleton == null)//是_Singleton已经被初始化之后,就不要进入锁等待了
  33. {
  34. lock (Singleton_Lock)
  35. //保证任意时刻只有一个线程进入lock范围
  36. //也限制了并发,尤其是_Singleton已经被初始化之后
  37. {
  38. //Thread.Sleep(1000);
  39. //Console.WriteLine("等待锁1s之后才继续。。。");
  40. if (_Singleton == null)//保证只实例化一次
  41. {
  42. _Singleton = new Singleton();
  43. }
  44. }
  45. }
  46. return _Singleton;
  47. }
  48. //既然是单例,大家用的是同一个对象,用的是同一个方法,那还会并发吗 还有线程安全问题吗?
  49. public int iTotal = 0;
  50. public void Show()
  51. {
  52. //lock (Singleton_Lock)
  53. //{
  54. this.iTotal++;
  55. //}
  56. }
  57. public static void Test()
  58. {
  59. Console.WriteLine("Test1");
  60. Console.WriteLine(_Singleton.iTotal);
  61. }
  62. }

 

原文链接:http://www.cnblogs.com/taotaozhuanyong/p/11548867.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号