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

济南搜索引擎优化网站网站建设工具有哪些

济南搜索引擎优化网站,网站建设工具有哪些,免费微信公众号素材网,做网站用属于前端文章目录 1.概述2.单例模式实现代码2.1.饿汉式单例2.2.懒汉式单例2.3.双检锁单例2.4.静态内部类单例2.5.枚举单例 3.对单例的一些思考3.1.是否需要严格的禁止单例被破坏#xff1f;3.2.懒汉式真的比饿汉式更佳吗#xff1f;3.3.单例存在的问题 4.其他作用范围的单例模式4.1.线… 文章目录 1.概述2.单例模式实现代码2.1.饿汉式单例2.2.懒汉式单例2.3.双检锁单例2.4.静态内部类单例2.5.枚举单例 3.对单例的一些思考3.1.是否需要严格的禁止单例被破坏3.2.懒汉式真的比饿汉式更佳吗3.3.单例存在的问题 4.其他作用范围的单例模式4.1.线程内的单例4.2.进程间的单例 5.“多例模式”6.总结 1.概述 单例模式是设计模式中最简单的一种对于很多人来说单例模式也是其接触的第一种设计模式当然我也不例外。这种设计模式在学习、面试、工作的过程中广泛传播相信不少人在面试时遇到过这样的问题“说说你最熟悉的集中设计模式”第一个脱口而出的就是单例模式。 所谓的单例模式就是在一定的作用范围内保证只有一个实例这种模式简单但是想要使用好它还需要学习一下它延伸出来的其他知识点本篇博文就对单例模式做一下简单的整理主要会包含以下几部分内容 单例模式的代码如何编写是否需要严格的禁止单例被破坏饿汉式和懒汉式应该如何选择单例模式存在什么问题线程内单例和进程间单例如何实现什么叫做“多例模式” 2.单例模式实现代码 单例模式的实现代码很多下面会例举一些常见的方式。 在Java中单例模式的作用范围一般情况下指的是当前的Java进程也就是进程内的对象保证唯一当然还有线程内、进程之间的单例下面会提到所以我们需要保证实例只会被初始化一次如何保证呢 2.1.饿汉式单例 一个简单的做法就是私有化构造方法也就是不让外部的客户端对象来调用new方法创建新的实例而是在项目启动时由单例类自行初始化这就是饿汉式单例 /*** 饿汉式单例*/ public class HungrySingleton {private static final HungrySingleton HUNGRY_SINGLETON new HungrySingleton();private HungrySingleton() {}public static HungrySingleton getInstance() {return HUNGRY_SINGLETON;} }2.2.懒汉式单例 如果不想再项目启动时初始化而是在使用的时候再初始化对象可以将对象的创建放到getInstance方法中这种方式叫做懒汉式单例。这种方式在多线程的情况下会有线程安全问题需要在创建对象时加锁。 /*** 懒汉式单例*/ public class LazySingleton {private static volatile LazySingleton lazySingleton;private LazySingleton() {}public static synchronized LazySingleton getInstance() {if (lazySingleton null) {lazySingleton new LazySingleton();}return lazySingleton;} }2.3.双检锁单例 在方法加的是类锁一次只有一个线程可以获取到单例对象为了提高获取对象的效率取消在方法上的类锁转而只给创建对象的那一行代码加锁。但是在并发的情况下多个线程同时进入getInstance方法都可以通过lazySingleton null的判断并在加锁那一行排队每个线程都会创建一个新的对象所以我们需要在锁里面再判断一次对象是否创建。 这种在加锁的代码前后都进行一次相同判断的做法我们叫做双重检查锁简称双检锁。 /*** 双检锁单例*/ public class LazySingleton {private static volatile LazySingleton lazySingleton;private LazySingleton() {}public static LazySingleton getInstance() {if (lazySingleton null) {synchronized (LazySingleton.class) {if (lazySingleton null) {lazySingleton new LazySingleton();}}}return lazySingleton;} }2.4.静态内部类单例 上面的懒汉式是为了保证懒加载的同时又不能有线程安全问题我们采用了加锁的方式那么不加锁行不行呢 当然是可以的我们采用静态内部类在受访问时才会初始化的特性来实现懒加载。 /*** 静态内部类单例*/ public class StaticClassSingleton {private StaticClassSingleton() {}public static StaticClassSingleton getInstance() {return InnerStaticClassSingleton.STATIC_CLASS_SINGLETON;}private static class InnerStaticClassSingleton {private static final StaticClassSingleton STATIC_CLASS_SINGLETON new StaticClassSingleton();} }2.5.枚举单例 Java中的枚举是天然的单例模式这种方式实现最简单而且不会有线程安全问题也能避免通过反射或者反序列化创建新的对象。 下面代码中的INSTANCE就是单例对象了。 /*** 枚举单例*/ public enum EnumSingleton {INSTANCE; }3.对单例的一些思考 3.1.是否需要严格的禁止单例被破坏 在上面的代码例子中我们采用的方式是私有化构造方法方法来避免外部对象new出新的单例对象但这种方式并不能完全避免创建出新的对象。其实上面的枚举单例中已经提到了可以通过反射、反序列化等方式创建出新的对象。 在考虑如何避免通过反射、反序列化创建对象可以先思考一下有没有必要去避免 还是回到最初那个点我们用了这么多方式来实现单例模式最终的目的就是为了在进程内的作用范围内只有一个实例。而在代码的开发过程中我们做好规范和约束以人为的方式来控制对象的创建数量哪怕没有私有化构造方法方法也能保证单例。而我们私有化构造方法更多的是给开发者做出一个提示这个类是个单例类并且防止一定的误操作。 可以想象一下我们要完全将各类创建和初始化的逻辑都“封闭”掉代码会臃肿到什么地步而这部分“封闭”的逻辑在业务开发中我们完全使用不到所以更建议以一种“约定由于配置”的方式来处理单例的创建问题。 综上做到私有化构造方法这一步就够了不需要过度开发。 3.2.懒汉式真的比饿汉式更佳吗 懒汉式主要是为了做懒加载当单例对象没有使用的时候就不创建和初始化特别是初始化是需要加载的资源比较多、比较耗时的时候用懒加载可以加快项目启动的速度同时又能减少系统的资源浪费。 但是从另一个角度讲如果不是在启动的时候初始化那就是在客户端调用的时候初始化想象一下一个高并发的互联网项目如果在客户端调用的时候再做耗时的初始化动作就可能造成接口的请求时间过长接口超时等会影响一批用户的使用体验。 另外如果初始化的过程中存在一些异常情况我们应该让问题在项目启动时就暴露出来及时修复而不是在用户使用的时候才暴露问题。 综上在业务开发中或许饿汉式单例是更好的选择。 3.3.单例存在的问题 单例模式编写和使用都很简单但是它也存在一些问题例如 面向对象支持不好单例模式在作用范围内只有一个实例那就无法通过创建更多的实例来使用面向对象的抽象、继承、多态等特性更像是一种面向过程的写法。违反开闭原则无法拓展每一次迭代都需要修改原有的代码。违反单一职责单例模式既创建对象、又管理对象职责模糊可能会导致代码变得复杂。 综上单例模式存在一定的问题如果存在拓展的需求就尽可能的避免使用单例模式。 但如果在不需要大量的拓展又没有业务间的复杂依赖关系使用单例模式就比较简洁方便也不失为一种选择例如各种无状态的工具类。 4.其他作用范围的单例模式 4.1.线程内的单例 即单例对象在线程内时唯一的线程之间不是唯一的我们开发中有一种很常见的情况线程局部变量一般是通过ThreadLocal来做的。 实现原理也比较简单其实就是使用一个全局的Map来保存对象以线程对象thread为key以需要保存的单例对象为value这样就保证了一个线程只对应一个对象。 在业务流程中的用户登录信息往往就是保存在ThreadLocal中的另外PageHelper这个著名的工具类也是通过ThreadLocal来实现的。 如果想了解ThreadLocal的使用方式可以参考我的另一篇博客《【并发编程】九线程安全的代码及ThreadLocal的使用》 如果想了解它详细的实现原理可以参考《【并发编程】十线程局部变量——ThreadLocal原理详解》 4.2.进程间的单例 进程间的单例更常用的一种说法分布式环境中的单例这类需求我们使用的也比较多其实现原理也比较简单就是将单例对象通过序列化的方式存储在一个多个服务都会共同访问的存储区域中例如一个共享的文件中、一些分布式的中间件中例如redis、zk等等而最常见的当然就是分布式锁。 我们只需要为单例对象创建出一个唯一标识在每个服务中判断唯一标识是否存在即可。 5.“多例模式” 多例模式是单例模式中的一种特例即可以在一定数量范围内创建类的多个实例还有一层理解就是不同类型的对象可以创建多个想通类型的对象只能创建一个后者的概念使用的更多。 以日志打印为例我们引入Slf4J后通过下面的方式获得一个日志对象 private Logger logger LoggerFactory.getLogger(xxx.class);这里获取的logger如果后面的class对象相同获取的就是同一个对象这种方式更像是工厂模式在代码中看到的也是工厂模式如下图 我们进入这个工厂模式的方法后可以看到下面的代码 这里就非常明显了这就是一种单例模式的创建方式通过一个Map将单例对象管理起来如果Map中有就直接返回如果没有就创建一个并放入到Map中这里的对象都是logger对象只是使用日志的类不一样这就是多例模式的一种体现。 另外在Spring中如果配置的bean是单例的其创建方式也与这种方式类似。 6.总结 本来主要讲述了以下几个点 单例模式的编写方式 饿汉式、懒汉式、静态内部类、枚举是否需要严格的禁止单例被破坏 没有必要写的太严格可以通过规范的方式来约束饿汉式和懒汉式应该如何选择 让耗时操作提前初始化让问题提早暴露及时修改而不是让用户去发现单例模式存在什么问题 没有面向对象拓展性差线程内单例和进程间单例如何实现 线程内单例通过线程局部变量来实现进程间的单例通过共享的存储区域来实现什么叫做“多例模式” 在一定数量范围内可以创建多个或者不同的类可以有多个、相同的类只能有一个
http://www.dnsts.com.cn/news/57437.html

相关文章:

  • 深圳机票网站建设网站及微信建设是否涉及知识产权
  • 网站icp不备案有关系吗互联网代运营公司
  • 营销型网站托管厦门的商城网站建设
  • 网站客户端怎么做的网站建设项目内控单
  • 温州电力建设有限公司网站5分钟的企业宣传片多少钱
  • 南江县建设局网站一个人是否可以做公司网站
  • 海口 做网站站长工具a级
  • 如何建设一家网站北京公司注册资金
  • wordpress多站点用户同步wordpress主题免费中文版
  • 福州网站制作建设制作一个网站需要多少小时
  • 网站建设中 html模板免费杂志模板
  • 做一件代发网站巨久科技网站建设
  • 编程基础知识大全seo建站工具
  • 在线搭建网站安徽住房和城乡建设厅网站
  • 微信推送怎么做购物网站类似站酷的网站建站
  • 皇家梅陇公馆网站建设郑州网课老师
  • 南宁做网站外贸平台都有哪些
  • 家具做网站专业做网站排名多少钱
  • 给公司做网站需要什么给自己的网站做代言
  • 网站建设中 模版cms建站方案
  • 网站正在建设中 代码开一家网站建设公司
  • 做阿里网站保定seo推广公司
  • wordpress内容页自定义字段什么是搜索引擎优化seo
  • 深圳网站建设 罗湖取消网站备案
  • 做我的奴隶腾讯网站会计做帐模板网站
  • 廊坊做网站的哪最多网站支付链接怎么做
  • 湛江定制建站企业网站泉州网站制作维护
  • 怎样用word2003做网站怎么个人做网站
  • 深圳深度网站建设上海网站推广平台
  • 软件开放和网站开发永兴县网站建设哪家好