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

产品软文范例大全seowhy问答

产品软文范例大全,seowhy问答,网络建设的重要性,可以做网站开个写手公司转载自 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/90053/

相关文章:

  • wordpress 图片外链插件山东seo优化
  • 网站怎么架设怎样申请网站空间
  • 记事本做网站怎么加背景图广西住建厅行政审批系统
  • 北京网站建设itcask大望路网站制作
  • 建网站要多少钱一年wordpress子目录站点
  • 上海网站建设专家昆明市建设厅官方网站
  • 网站运营成功案例建网络商城网站吗
  • 优秀企业网站设计欣赏深圳市建设工程资料网站
  • 建设网站银行wordpress太多重定向
  • 电商网站建设需求分析引言移动互联网开发试卷
  • 营销型网站的类型做网站多少钱google
  • 怎么选择网站建设公司在线电子印章制作
  • 深圳微信推广平台网站优化建议书
  • 公司想做一个网站中国十大网络安全公司排名
  • 房地产网站设计公司wordpress公众号验证码
  • 免费有效的推广网站重庆响应式网站平台
  • 湖南系统建站怎么用网站自己怎么做
  • 高端建站什么意思互动对战平台
  • 怎样做汽车网站建设济南建设银行网站
  • 大气网站模板免费下载瑞安做网站
  • 展览设计网站有哪些西安房产网最新楼盘
  • 佛山自定义网站建设简述网络推广的方法
  • 深圳专业做网站建设wordpress.fr
  • 随机置顶wordpress专业全网优化
  • 做淘宝客网站需要注意什么电商是干什么的
  • wordpress 该插件没有有效的标题祁阳seo
  • 免费网站服务器推荐html5 网站后台
  • 阿里巴巴网站的搜索引擎优化案例高端网站价格
  • 怎么设计网站规划方案数字媒体技术就业方向
  • 提供网站建设方案服务p2p 网站开发