当前位置: 首页 > 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://wiki.neutronadmin.com/news/281200/

相关文章:

  • 网站建设管理经验做法网站建设工作函
  • 中医网站模板wordpress 主题 数据
  • 重庆网站建设公司招聘潍坊网站建设方案托管
  • 平台类网站做多久平面设计师服务平台
  • 网络营销推广网站收录智能科技网站模板
  • 怎样做安居客网站cms内容管理系统是什么
  • 微信云网站用什么做移动页面
  • 中国中小企业网官方网站如何用pageadmin做网站
  • 文化传播网站模板国际传来10个最新消息
  • 学校网站用途站长推荐自动跳转导航入口
  • 网站备案号显示红色pythom+网站开发规范
  • 怎样查网站有没有备案超级采购小程序怎么注册
  • 沈阳德泰诺网站建设公司怎么样网站开发的技术简介
  • 网站首页菜单栏网站服务器的重要性
  • 万网网站备案多久前端响应式
  • 网站租服务器军事新闻最新消息军事新闻
  • wordpress站点logo设置html网页模板资源
  • 描述网站建设的具体流程网页传奇推荐
  • 重庆家居网站制作公司做字幕网站有哪些
  • 网站建设观点新能源汽车价格排名
  • 网站导航颜色哈尔滨h5模板建站
  • dw可以制作网站吗静态网页设计教程
  • 做游戏奖金不被发现网站亚洲风影视传媒有限公司辽宁
  • 花都电子商务网站建设做 爱 网站视频教程
  • 官方网站套餐网站关键词搜索排名
  • 做网站公司有什么出路dedecms医院网站
  • 中展建设股份有限公司网站微信网站制作价格
  • 建设一个班级网站的具体步骤深圳代理网络推广公司
  • 网站内链代码域名注册需要哪些条件
  • 网站设计公司 推荐昆明网站建设方案外包