经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
设计模式—singleton(单例模式)
来源:cnblogs  作者:计蒜未来  时间:2021/3/29 9:11:07  对本文有异议

单例模式

  • 单例设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。

    这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

应用实例

  • Windows是多进程多线程的,通过唯一的实例来操作一个文件,避免地出现多个进程或线程同时操作一个文件的现象。

  • 一些设备管理器常常设计为单例模式(如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件)。

使用场景

  • 要求生产唯一序列号。

  • WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。

  • 创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。

单例实现

  • 方式一

方式二

  • 改进了方式一的缺点,但同时带来了线程安全问题

  • 假设有两个线程,线程1到第9行判断完实例是否为空时(还没到new一个实例),线程2也到了判断实例是否为空的位置,

    因为线程1还没创建实例,INSTANCE仍为空,线程2创建完一个实例后,线程1继续执行也创建了一个实例。

方式三

  • 通过synchronized加锁,解决方式二的线程安全问题,但也带来了效率下降。

  • 通过加锁,锁定了Mgr03.class对象,因此输出的hashcode是相同的。

方式四

  • 双重校验锁,完美的单例模式写法之一。

  • 如果只有外层判断,就会出现线程安全问题(如同方式二)。

方式五

  • 静态内部类方式,解决了方式一的问题,达到了按需初始化的目的,是完美的单例模式之一。

方式六

  • 通过枚举实现单例

  1. public class Mgr05 {
  2. private Mgr05() {};
  3. //类Mgr05加载时,内部类不会加载
  4. private static class Mgr05Holder{
  5. private final static Mgr05 INSTANCE=new Mgr05();
  6. }
  7. //调用getInstance(),类Mgr05Holder加载
  8. public static Mgr05 getInstance() {return Mgr05Holder.INSTANCE;};
  9. public static void main(String[] args) {
  10. for(int i=0;i<200;i++) {
  11. new Thread(()->{
  12. System.out.println(Mgr05.getInstance().hashCode());
  13. }).start();
  14. }
  15. }
  16. }
  1. public class Mgr04 {
  2. private static volatile Mgr04 INSTANCE;
  3. private Mgr04() {};
  4. public static synchronized Mgr04 getInstance() {
  5. if(INSTANCE==null) {//双重校验锁
  6. synchronized (Mgr04.class) {
  7. if(INSTANCE==null) {
  8. try {
  9. Thread.sleep(10);
  10. }catch(InterruptedException e) {
  11. e.printStackTrace();
  12. }
  13. }
  14. }
  15. INSTANCE=new Mgr04();
  16. }
  17. return INSTANCE;
  18. }
  19. public void c() {System.out.println("c");}
  20. public static void main(String[] args) {
  21. for(int i=0;i<200;i++) {
  22. new Thread(()->{
  23. System.out.println(Mgr04.getInstance().hashCode());
  24. }).start();
  25. }
  26. }
  27. }

原文链接:http://www.cnblogs.com/wuzh/p/14565442.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号