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

陕西十二建设有限公司网站英文企业网站模板

陕西十二建设有限公司网站,英文企业网站模板,手机旅游网站建设,网站开发方式的选择上两节课中#xff0c;我们针对单例模式#xff0c;讲解了单例的应用场景、几种常见的代码实现和存在的问题#xff0c;并粗略给出了替换单例模式的方法#xff0c;比如工厂模式、IOC 容器。今天#xff0c;我们再进一步扩展延伸一下#xff0c;一块讨论一下下面这几个问…上两节课中我们针对单例模式讲解了单例的应用场景、几种常见的代码实现和存在的问题并粗略给出了替换单例模式的方法比如工厂模式、IOC 容器。今天我们再进一步扩展延伸一下一块讨论一下下面这几个问题 如何理解单例模式中的唯一性如何实现线程唯一的单例如何实现集群环境下的单例如何实现一个多例模式 今天的内容稍微有点“烧脑”希望你在看的过程中多思考一下。话不多说让我们正式开始今天的学习吧 如何理解单例模式中的唯一性 首先我们重新看一下单例的定义“一个类只允许创建唯一一个对象或者实例那这个类就是一个单例类这种设计模式就叫作单例设计模式简称单例模式。” 定义中提到“一个类只允许创建唯一一个对象”。那对象的唯一性的作用范围是什么呢是指线程内只允许创建一个对象还是指进程内只允许创建一个对象答案是后者也就是说单例模式创建的对象是进程唯一的。这里有点不好理解我来详细地解释一下。 我们编写的代码通过编译、链接组织在一起就构成了一个操作系统可以执行的文件也就是我们平时所说的“可执行文件”比如 Windows 下的 exe 文件。可执行文件实际上就是代码被翻译成操作系统可理解的一组指令你完全可以简单地理解为就是代码本身。 当我们使用命令行或者双击运行这个可执行文件的时候操作系统会启动一个进程将这个执行文件从磁盘加载到自己的进程地址空间可以理解操作系统为进程分配的内存存储区用来存储代码和数据。接着进程就一条一条地执行可执行文件中包含的代码。比如当进程读到代码中的 User user new User(); 这条语句的时候它就在自己的地址空间中创建一个 user 临时变量和一个 User 对象。 进程之间是不共享地址空间的如果我们在一个进程中创建另外一个进程比如代码中有一个 fork() 语句进程执行到这条语句的时候会创建一个新的进程操作系统会给新进程分配新的地址空间并且将老进程地址空间的所有内容重新拷贝一份到新进程的地址空间中这些内容包括代码、数据比如 user 临时变量、User 对象。 所以单例类在老进程中存在且只能存在一个对象在新进程中也会存在且只能存在一个对象。而且这两个对象并不是同一个对象这也就说单例类中对象的唯一性的作用范围是进程内的在进程间是不唯一的。 如何实现线程唯一的单例 刚刚我们讲了单例类对象是进程唯一的一个进程只能有一个单例对象。那如何实现一个线程唯一的单例呢 我们先来看一下什么是线程唯一的单例以及“线程唯一”和“进程唯一”的区别。 “进程唯一”指的是进程内唯一进程间不唯一。类比一下“线程唯一”指的是线程内唯一线程间可以不唯一。实际上“进程唯一”还代表了线程内、线程间都唯一这也是“进程唯一”和“线程唯一”的区别之处。这段话听起来有点像绕口令我举个例子来解释一下。 假设 IdGenerator 是一个线程唯一的单例类。在线程 A 内我们可以创建一个单例对象 a。因为线程内唯一在线程 A 内就不能再创建新的 IdGenerator 对象了而线程间可以不唯一所以在另外一个线程 B 内我们还可以重新创建一个新的单例对象 b。 尽管概念理解起来比较复杂但线程唯一单例的代码实现很简单如下所示。在代码中我们通过一个 HashMap 来存储对象其中 key 是线程 IDvalue 是对象。这样我们就可以做到不同的线程对应不同的对象同一个线程只能对应一个对象。实际上Java 语言本身提供了 ThreadLocal 工具类可以更加轻松地实现线程唯一单例。不过ThreadLocal 底层实现原理也是基于下面代码中所示的 HashMap。 public class IdGenerator {private AtomicLong id new AtomicLong(0);private static final ConcurrentHashMapLong, IdGenerator instances new ConcurrentHashMap();private IdGenerator() {}public static IdGenerator getInstance() {Long currentThreadId Thread.currentThread().getId();instances.putIfAbsent(currentThreadId, new IdGenerator());return instances.get(currentThreadId);}public long getId() {return id.incrementAndGet();} }如何实现集群环境下的单例 刚刚我们讲了“进程唯一”的单例和“线程唯一”的单例现在我们再来看下“集群唯一”的单例。 首先我们还是先来解释一下什么是“集群唯一”的单例。 我们还是将它跟“进程唯一”“线程唯一”做个对比。“进程唯一”指的是进程内唯一、进程间不唯一。“线程唯一”指的是线程内唯一、线程间不唯一。集群相当于多个进程构成的一个集合“集群唯一”就相当于是进程内唯一、进程间也唯一。也就是说不同的进程间共享同一个对象不能创建同一个类的多个对象。 我们知道经典的单例模式是进程内唯一的那如何实现一个进程间也唯一的单例呢如果严格按照不同的进程间共享同一个对象来实现那集群唯一的单例实现起来就有点难度了。 具体来说我们需要把这个单例对象序列化并存储到外部共享存储区比如文件。进程在使用这个单例对象的时候需要先从外部共享存储区中将它读取到内存并反序列化成对象然后再使用使用完成之后还需要再存储回外部共享存储区。 为了保证任何时刻在进程间都只有一份对象存在一个进程在获取到对象之后需要对对象加锁避免其他进程再将其获取。在进程使用完这个对象之后还需要显式地将对象从内存中删除并且释放对对象的加锁。 按照这个思路我用伪代码实现了一下这个过程具体如下所示 public class IdGenerator {private AtomicLong id new AtomicLong(0);private static IdGenerator instance;private static SharedObjectStorage storage FileSharedObjectStorage(/*入参省略比如文件地址*/);private static DistributedLock lock new DistributedLock();private IdGenerator() {}public synchronized static IdGenerator getInstance() if (instance null) {lock.lock();instance storage.load(IdGenerator.class);}return instance;}public synchroinzed void freeInstance() {storage.save(this, IdGeneator.class);instance null; //释放对象lock.unlock();}public long getId() { return id.incrementAndGet();} } // IdGenerator使用举例 IdGenerator idGeneator IdGenerator.getInstance(); long id idGenerator.getId(); IdGenerator.freeInstance();如何实现一个多例模式 跟单例模式概念相对应的还有一个多例模式。那如何实现一个多例模式呢 “单例”指的是一个类只能创建一个对象。对应地“多例”指的就是一个类可以创建多个对象但是个数是有限制的比如只能创建 3 个对象。如果用代码来简单示例一下的话就是下面这个样子 public class BackendServer {private long serverNo;private String serverAddress;private static final int SERVER_COUNT 3;private static final MapLong, BackendServer serverInstances new HashMap();static {serverInstances.put(1L, new BackendServer(1L, 192.134.22.138:8080));serverInstances.put(2L, new BackendServer(2L, 192.134.22.139:8080));serverInstances.put(3L, new BackendServer(3L, 192.134.22.140:8080));}private BackendServer(long serverNo, String serverAddress) {this.serverNo serverNo;this.serverAddress serverAddress;}public BackendServer getInstance(long serverNo) {return serverInstances.get(serverNo);}public BackendServer getRandomInstance() {Random r new Random();int no r.nextInt(SERVER_COUNT)1;return serverInstances.get(no);} }实际上对于多例模式还有一种理解方式同一类型的只能创建一个对象不同类型的可以创建多个对象。这里的“类型”如何理解呢 我们还是通过一个例子来解释一下具体代码如下所示。在代码中logger name 就是刚刚说的“类型”同一个 logger name 获取到的对象实例是相同的不同的 logger name 获取到的对象实例是不同的。 public class Logger {private static final ConcurrentHashMapString, Logger instances new ConcurrentHashMap();private Logger() {}public static Logger getInstance(String loggerName) {instances.putIfAbsent(loggerName, new Logger());return instances.get(loggerName);}public void log() {//...} } //l1l2, l1!l3 Logger l1 Logger.getInstance(User.class); Logger l2 Logger.getInstance(User.class); Logger l3 Logger.getInstance(Order.class);这种多例模式的理解方式有点类似工厂模式。它跟工厂模式的不同之处是多例模式创建的对象都是同一个类的对象而工厂模式创建的是不同子类的对象关于这一点下一节课中就会讲到。实际上它还有点类似享元模式两者的区别等到我们讲到享元模式的时候再来分析。除此之外实际上枚举类型也相当于多例模式一个类型只能对应一个对象一个类可以创建多个对象。 重点回顾 好了今天的内容到此就讲完了。我们来一块总结回顾一下你需要掌握的重点内容。 今天的内容比较偏理论在实际的项目开发中没有太多的应用。讲解的目的主要还是拓展你的思路锻炼你的逻辑思维能力加深你对单例的认识。 如何理解单例模式的唯一性 单例类中对象的唯一性的作用范围是“进程唯一”的。“进程唯一”指的是进程内唯一进程间不唯一“线程唯一”指的是线程内唯一线程间可以不唯一。实际上“进程唯一”就意味着线程内、线程间都唯一这也是“进程唯一”和“线程唯一”的区别之处。“集群唯一”指的是进程内唯一、进程间也唯一。 如何实现线程唯一的单例 我们通过一个 HashMap 来存储对象其中 key 是线程 IDvalue 是对象。这样我们就可以做到不同的线程对应不同的对象同一个线程只能对应一个对象。实际上Java 语言本身提供了 ThreadLocal 并发工具类可以更加轻松地实现线程唯一单例。 如何实现集群环境下的单例 我们需要把这个单例对象序列化并存储到外部共享存储区比如文件。进程在使用这个单例对象的时候需要先从外部共享存储区中将它读取到内存并反序列化成对象然后再使用使用完成之后还需要再存储回外部共享存储区。为了保证任何时刻在进程间都只有一份对象存在一个进程在获取到对象之后需要对对象加锁避免其他进程再将其获取。在进程使用完这个对象之后需要显式地将对象从内存中删除并且释放对对象的加锁。 如何实现一个多例模式 “单例”指的是一个类只能创建一个对象。对应地“多例”指的就是一个类可以创建多个对象但是个数是有限制的比如只能创建 3 个对象。多例的实现也比较简单通过一个 Map 来存储对象类型和对象之间的对应关系来控制对象的个数。 课堂讨论 在文章中我们讲到单例唯一性的作用范围是进程实际上对于 Java 语言来说单例类对象的唯一性的作用范围并非进程而是类加载器Class Loader你能自己研究并解释一下为什么吗
http://www.dnsts.com.cn/news/43483.html

相关文章:

  • 湖南中小企业建站价格小朋友做安全教育的网站
  • 常州做网站找哪家好wordpress api开发文档
  • 网上有哪些购物网站学校网站开发方案
  • dede资讯类网站模板上海 企业网站建设
  • 抖音合作推广平台南京关键词优化服务
  • 制作网站页面网页链接
  • 新手学做网站pdf手怎么做网站把图片发到网上
  • 重庆网站界面设计公众号怎么建立
  • 上海网站建设网页制作深圳福田网站优化网络营销培训学校
  • dedecms生成网站地图厦门做外贸网站
  • 珠海网站建立seo软件资源
  • 游戏网站设计风格有哪些网站风格模板
  • 上饶市建设局官方网站中国建设银行网站慢
  • 网站建设ppt课件自动生成网址的软件
  • 租用网站服务器网站建设服务是什么意思
  • 网站建设那个好网站样式模板
  • 网站视觉设计方案wordpress ip 访问
  • 华东建设安装有限公司网站常州网站建设 个人
  • 网站建设电商板块哈尔滨关键词优化软件
  • 用源码建设网站wordpress如何删除你好和设置菜单
  • 高端品牌内衣拼多多关键词怎么优化
  • 怎么做自己的免费网站中国品牌加盟网官网
  • 厦门快速建网站微信公众号注册流程
  • 网站封面如何做的吸引人怎么弄微信小程序卖东西
  • php 网站后台管理系统wordpress如何修改html代码
  • 网站开发结语html5购物网站
  • 多语言外贸网站源码手机网站自动适配
  • 想自己建个网站搜索排行
  • 网站备案 固定电话中国企业报集团是央企吗
  • 广州专业做网站的科技公司wordpress显示icp备案号