当前位置: 首页 > news >正文

网站建设加工1688阿里巴巴国际站首页

网站建设加工,1688阿里巴巴国际站首页,怎么把字体安装到电脑wordpress,个体营业执照忘记年检能补吗转载自 JAVA设计模式之单例模式本文继续介绍23种设计模式系列之单例模式。 概念#xff1a;  java中单例模式是一种常见的设计模式#xff0c;单例模式的写法有好几种#xff0c;这里主要介绍三种#xff1a;懒汉式单例、饿汉式单例、登记式单例。  单例模式有以下特点…转载自  JAVA设计模式之单例模式本文继续介绍23种设计模式系列之单例模式。 概念  java中单例模式是一种常见的设计模式单例模式的写法有好几种这里主要介绍三种懒汉式单例、饿汉式单例、登记式单例。  单例模式有以下特点  1、单例类只能有一个实例。  2、单例类必须自己创建自己的唯一实例。  3、单例类必须给所有其他对象提供这一实例。  单例模式确保某个类只有一个实例而且自行实例化并向整个系统提供这个实例。在计算机系统中线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机但只能有一个Printer Spooler以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口系统应当集中管理这些通信端口以避免一个通信端口同时被两个请求同时调用。总之选择单例模式就是为了避免不一致状态避免政出多头。 一、懒汉式单例[java] view plaincopy//懒汉式单例类.在第一次调用的时候实例化自己   public class Singleton {      private Singleton() {}      private static Singleton singlenull;      //静态工厂方法       public static Singleton getInstance() {           if (single  null) {                 single  new Singleton();           }            return single;      }  }  Singleton通过将构造方法限定为private避免了类在外部被实例化在同一个虚拟机范围内Singleton的唯一实例只能通过getInstance()方法访问。事实上通过Java反射机制是能够实例化构造方法为private的类的那基本上会使所有的Java单例实现失效。此问题在此处不做讨论姑且掩耳盗铃地认为反射机制不存在。 但是以上懒汉式单例的实现没有考虑线程安全问题它是线程不安全的并发环境下很可能出现多个Singleton实例要实现线程安全有以下三种方式都是对getInstance这个方法改造保证了懒汉式单例的线程安全如果你第一次接触单例模式对线程安全不是很了解可以先跳过下面这三小条去看饿汉式单例等看完后面再回头考虑线程安全的问题1、在getInstance方法上加同步[java] view plaincopypublic static synchronized Singleton getInstance() {           if (single  null) {                 single  new Singleton();           }            return single;  }  2、双重检查锁定[java] view plaincopypublic static Singleton getInstance() {          if (singleton  null) {                synchronized (Singleton.class) {                   if (singleton  null) {                      singleton  new Singleton();                  }                }            }            return singleton;       }  3、静态内部类[java] view plaincopypublic class Singleton {        private static class LazyHolder {           private static final Singleton INSTANCE  new Singleton();        }        private Singleton (){}        public static final Singleton getInstance() {           return LazyHolder.INSTANCE;        }    }    这种比上面1、2都好一些既实现了线程安全又避免了同步带来的性能影响。二、饿汉式单例[java] view plaincopy//饿汉式单例类.在类初始化时已经自行实例化   public class Singleton1 {      private Singleton1() {}      private static final Singleton1 single  new Singleton1();      //静态工厂方法       public static Singleton1 getInstance() {          return single;      }  }  饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用以后不再改变所以天生是线程安全的。三、登记式单例(可忽略) [java] view plaincopy//类似Spring里面的方法将类名注册下次从里面直接获取。  public class Singleton3 {      private static MapString,Singleton3 map  new HashMapString,Singleton3();      static{          Singleton3 single  new Singleton3();          map.put(single.getClass().getName(), single);      }      //保护的默认构造子      protected Singleton3(){}      //静态工厂方法,返还此类惟一的实例      public static Singleton3 getInstance(String name) {          if(name  null) {              name  Singleton3.class.getName();              System.out.println(name  null---namename);          }          if(map.get(name)  null) {              try {                  map.put(name, (Singleton3) Class.forName(name).newInstance());              } catch (InstantiationException e) {                  e.printStackTrace();              } catch (IllegalAccessException e) {                  e.printStackTrace();              } catch (ClassNotFoundException e) {                  e.printStackTrace();              }          }          return map.get(name);      }      //一个示意性的商业方法      public String about() {              return Hello, I am RegSingleton.;          }          public static void main(String[] args) {          Singleton3 single3  Singleton3.getInstance(null);          System.out.println(single3.about());      }  }  登记式单例实际上维护了一组单例类的实例将这些实例存放在一个Map登记薄中对于已经登记过的实例则从Map直接返回对于没有登记的则先登记然后返回。  这里我对登记式单例标记了可忽略我的理解来说首先它用的比较少另外其实内部实现还是用的饿汉式单例因为其中的static方法块它的单例在类被装载的时候就被实例化了。饿汉式和懒汉式区别 从名字上来说饿汉和懒汉 饿汉就是类一旦加载就把单例初始化完成保证getInstance的时候单例是已经存在的了 而懒汉比较懒只有当调用getInstance的时候才回去初始化这个单例。 另外从以下两点再区分以下这两种方式1、线程安全 饿汉式天生就是线程安全的可以直接用于多线程而不会出现问题 懒汉式本身是非线程安全的为了实现线程安全有几种写法分别是上面的1、2、3这三种实现在资源加载和性能方面有些区别。2、资源加载和性能 饿汉式在类创建的同时就实例化一个静态对象出来不管之后会不会使用这个单例都会占据一定的内存但是相应的在第一次调用时速度也会更快因为其资源已经初始化完成 而懒汉式顾名思义会延迟加载在第一次使用该单例的时候才会实例化对象出来第一次调用时要做初始化如果要做的工作比较多性能上会有些延迟之后就和饿汉式一样了。 至于1、2、3这三种实现又有些区别 第1种在方法调用上加了同步虽然线程安全了但是每次都要同步会影响性能毕竟99%的情况下是不需要同步的 第2种在getInstance中做了两次null检查确保了只有第一次调用单例的时候才会做同步这样也是线程安全的同时避免了每次都同步的性能损耗 第3种利用了classloader的机制来保证初始化instance时只有一个线程所以也是线程安全的同时没有性能损耗所以一般我倾向于使用这一种。什么是线程安全 如果你的代码所在的进程中有多个线程在同时运行而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的而且其他的变量的值也和预期的是一样的就是线程安全的。 或者说一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题那就是线程安全的。应用 以下是一个单例类使用的例子以懒汉式为例这里为了保证线程安全使用了双重检查锁定的方式[java] view plaincopypublic class TestSingleton {      String name  null;            private TestSingleton() {      }        private static volatile TestSingleton instance  null;        public static TestSingleton getInstance() {             if (instance  null) {                 synchronized (TestSingleton.class) {                    if (instance  null) {                       instance  new TestSingleton();                   }                 }               }              return instance;      }        public String getName() {          return name;      }        public void setName(String name) {          this.name  name;      }        public void printInfo() {          System.out.println(the name is   name);      }    }  可以看到里面加了volatile关键字来声明单例对象既然synchronized已经起到了多线程下原子性、有序性、可见性的作用为什么还要加volatile呢原因已经在下面评论中提到 还有疑问可参考http://www.iteye.com/topic/652440和http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html[java] view plaincopypublic class TMain {      public static void main(String[] args){          TestStream ts1  TestSingleton.getInstance();          ts1.setName(jason);          TestStream ts2  TestSingleton.getInstance();          ts2.setName(0539);                    ts1.printInfo();          ts2.printInfo();                    if(ts1  ts2){              System.out.println(创建的是同一个实例);          }else{              System.out.println(创建的不是同一个实例);          }      }  }  运行结果结论由结果可以得知单例模式为一个面向对象的应用程序提供了对象惟一的访问点不管它实现何种功能整个应用程序都会同享一个实例对象。 对于单例模式的几种实现方式知道饿汉式和懒汉式的区别线程安全资源加载的时机还有懒汉式为了实现线程安全的3种方式的细微差别。
http://www.sadfv.cn/news/281200/

相关文章:

  • 四川专门做招聘酒的网站十五种网络营销工具
  • 微商城网站建设行情网站开发团队工作总结
  • 什么网站做问卷好龙岩到永定
  • 大连网络推广网站优化找哪家好做足彩推荐赚钱的网站
  • 033340网站建设与管理蒙文网站建设
  • 网站开发 工期安排百度扫一扫识别图片在线
  • 美食网站开发计划重庆广告牌制作
  • 整站seo排名费用价格做泵阀到哪个网站好
  • 酒店网站建设系统介绍番禺建设银行网站
  • 宁河做网站公司怎么创造自己的网站
  • 如何查看一个网站的所有二级域名网站开发需要多少钱方案
  • 佛山移动网站设计个人优秀网页设计图片
  • 陕西手机网站建站互联网公司排名图
  • 什么网站做调查能赚钱吗西安黄页
  • 现在建设公司网站用什么软件万能应用商店下载安装
  • 工业设计公司属于什么行业网站seo测评
  • 婚纱摄影网站建设公司自适应网站好处
  • 信邦建设工程有限公司网站wordpress链接 颜色
  • 大连网站制作案例长沙公司排行
  • 快速网站开发介绍网页超链接制作
  • python学习网站做网站 技术
  • 网站调用时间微信电商网站开发
  • 阿里云主机做网站域名备案查询
  • 商城网站怎么建设做网站要多少像素
  • 网站维护员招聘网站管理包括哪些内容
  • 河南省建设厅网站154号文件网站建设预付款如何付
  • 网站排名突然下降解决黄页网站推广公司
  • 番禺建设银行网站资源站源码永久
  • 网站引流是什么意思html5 网站建设方案
  • 南通企业建设网站电话广东朝阳企讯通科技有限公司