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

网站制作企业有哪些公司智能家居产品设计案例

网站制作企业有哪些公司,智能家居产品设计案例,WordPress干什么的,网站引导页设计“风不来见我 我自去见风” 前面说到了一些关于多线程的话题,那么下面的这几篇文章围绕着多线程来说一些案例,那么第一篇便是多线程案例之单例模式。 什么是单例模式: 单例模式是一种设计模式,确保在整个应用程序中只有一个类的…

“风不来见我 我自去见风”

 

前面说到了一些关于多线程的话题,那么下面的这几篇文章围绕着多线程来说一些案例,那么第一篇便是多线程案例之单例模式。

什么是单例模式:

单例模式是一种设计模式,确保在整个应用程序中只有一个类的实例,并且提供一个全局访问点。

单例模式的作用:

  1. 控制实例数目:确保类只有一个实例,防止创建多个对象,节省资源。
  2. 全局访问:提供一个全局访问点,可以通过该点访问唯一的实例。
  3. 延迟初始化:单例对象可以在第一次使用时创建,有助于提高性能。
  4. 节约资源:对于需要频繁访问的对象或服务,使用单例模式可以减少内存消耗。

单例常见用例:

  • 数据库连接池:通常我们只需一个连接池来管理多个数据库连接。
  • 日志管理:只有一个日志管理实例,统一处理日志信息。
  • 配置管理:配置类可以在整个应用中共享,同步配置状态。

饿汉版单例:

public class ThreadHungerSingle {private static ThreadHungerSingle instance = new ThreadHungerSingle();public static ThreadHungerSingle getInstance() {return instance;}//单例模式最关键部分private ThreadHungerSingle() {};
}

 饿汉 的意思就是 “迫切”,在类的加载的时候,就会被创建出这个单例的实例。

懒汉版单例:

public class ThreadLazySingle {private static ThreadLazySingle instance = null;public static ThreadLazySingle getInstance() {if(null == instance) {instance = new ThreadLazySingle();}return instance;}private ThreadLazySingle() {};
}

懒汉 的特点就是 “懒”,在计算机中,“懒”是一个褒义词呢。只有在被用到时,才会真正创建出实例。

那么对于上述的两个版本,如果是在多线程环境下,调用getInstance时,谁会存在线程安全问题呢?

显然地是我们的懒汉版单例在多线程环境下会存在问题,饿汉版只是单纯的“读”操作,而懒汉版会有“写”操作,下面我们一起来看看这个图便知道了:

存在线程安全问题的话,此时我们就需要进行 加锁 操作来解决了,那么代码如下:

class ThreadLazySingle2 {private static ThreadLazySingle2 instance = null;private static final Object locker = new Object();public static ThreadLazySingle2 getInstance() {synchronized (locker) {if(null == instance) {instance = new ThreadLazySingle2();}}return instance;}private ThreadLazySingle2() {};
}

加了锁之后确实解决了线程安全问题,但是加锁同样也可能带来阻塞。如果上述代码,已经new完对象了,那么后续的代码都是单纯的“读”操作,此时调用getInstance也是线程安全的,那么就没有必要加锁了。所以我们可以在前面加上同样的判断:

class ThreadLazySingle2 {private static ThreadLazySingle2 instance = null;private static final Object locker = new Object();public static ThreadLazySingle2 getInstance() {if(null == instance) {synchronized (locker) {if(null == instance) {instance = new ThreadLazySingle2();}}}return instance;}private ThreadLazySingle2() {};
}

上述两个相同的判断条件看起来好像是有问题的,但是它们各有各的用处,第一个条件判断,判断的是是否需要进行加锁,第二个条件判断,判断的是是否需要进行实例对象。对于锁之间的阻塞,我们无法预测它们会阻塞多久,可能会是“沧海桑田”。

指令重排序:

上述代码中,还存在一个问题,可能会因为编译器的优化带来指令重排序的线程安全问题。什么是指令重排序呢:是计算机体系结构中的一种优化技术,主要指处理器或编译器在不改变程序最终结果的前提下,重新排列指令的执行顺序,以提高性能(如减少流水线停顿、提高缓存命中率等)。

instance = new ThreadLazySingle2();这里我分为三步进行举例说明:1.分配地址空间 2.执行构造方法 3.内存空间的地址,赋值给引用变量。我们一起来看一看,在多线程环境下,他会存在什么样的问题呢:

怎样解决指令重排序的问题呢,也是使用我们的关键字 volatile ,加上 volatile 关键字之后,编译器就会发现 instance 是 “易失” 的,便不会进行上述的优化,所以我们的最终版本是这样的:

class ThreadLazySingle1 {private static volatile ThreadLazySingle1 instance = null;private static final Object locker = new Object();public static ThreadLazySingle1 getInstance() {//此处的if判定是否需要加锁if(null == instance) {//由于只需要第一次创建出来实例就行,后续的代码,都是单纯的 读 操作,此时 getInstance不加锁也是 线程安全的,没有必要加锁//当前写法,只要调用getInstance,都会触发加锁操作,此时虽然没有加锁操作了,但是也会因为加锁,产生阻塞,影响到性能synchronized (locker) {//此处的if判断是否要创建对象if(null == instance) {//这个代码可能会因为指令重排序,引起线程安全问题 所以上面应该加上 volatile 关键字instance = new ThreadLazySingle1();}}}return instance;}private ThreadLazySingle1() {};
}

因此 Java 的volatile 有两个功能:1.保证内存可见性 2.禁止指令重排序

好了,我们本期的内容就讲到这里了,我们下期再见!!! 

http://www.dtcms.com/a/599901.html

相关文章:

  • 快要到期的域名网站有人用wordpress做企业
  • 网站如何做银联在线支付网页设计与制作过程中遇到的问题
  • 新圩做网站公司肇庆市端州发布
  • ps如何做游戏模板下载网站福安网站定制
  • 建站快车打电话专业的网站开发公司
  • 湖州市网站建设电商网站 建设价格
  • 网站是公司域名是个人可以wordpress菜单背景半透明
  • 汽车类网站设计规划阿克苏建设租房信息阿克苏租房网站
  • 成都装修公司网站建设济南网站建设sdqswl
  • 深圳网站设计公司排名前十网站建设以及网页设计需要会什么
  • 网站教程设计用织梦建网站
  • 网站改版公司哪家好佛山选择免费网站优化
  • 网站开发协议合作网站优化18600119496
  • 建设部网站统计招聘网站竞品分析怎么做
  • 公司建立自己的网站有什么好处网页版传奇哪个好玩
  • 网站做三层结构外贸收款平台有哪些
  • seo网站外包南京建设交易中心网站
  • 徐州建筑工程招投标网站企微scrm收费
  • 做电商网站多少钱西直门网站建设
  • 主机屋怎么做网站网站域名要实名认证吗
  • 苏州市建设厅网站首页建设六马路小学网站
  • 网站制作com cn域名有什么区别信息网络公司经营范围
  • 海外直购网站建设方案书范文互联网科技公司简介
  • 在线个人网站建设工程报建网站查询
  • 织梦网站修改教程视频做微网站用哪个平台
  • 做问卷调查的网站有啥培训机构网络推广方案
  • 网站cdn自己做亿度网络网站建设
  • 做网站吗怎么制作链接
  • 做神马网站优化快速排flask做的网站有哪些
  • 网站图标目录优设网logo