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

建立网站的教学书籍黄页网站推广

建立网站的教学书籍,黄页网站推广,商业网站设计,wordpress 技术分析目录 单例模式 饿汉模式 懒汉模式 前言 多线程中有许多非常经典的设计模式(这就类似于围棋的棋谱),这是用来解决我们在开发中遇到很多 "经典场景",简单来说,设计模式就是一份模板,可以套用。…

目录

单例模式

饿汉模式

懒汉模式 


前言

多线程中有许多非常经典的设计模式(这就类似于围棋的棋谱),这是用来解决我们在开发中遇到很多 "经典场景",简单来说,设计模式就是一份模板,可以套用。


单例模式

顾名思义,就是一个程序只能含有一个实例,有的场景中,希望一个类只能有一个对象,例如 JDBC 中的 DataSourse 实例就只需要一个。虽说程序员可以在编写代码时只给类创建一个对象,但是人毕竟没有机器靠谱,所以大佬们就设计了一套模板,按照模板来写代码,就不会出大的差错。

实现单例模式的方法有两种:饿汉模式 和 懒汉模式。

饿汉模式

就是在类加载时,就创建实例。

class SingleDemo{//在类加载的时候创建private static SingleDemo instance = new SingleDemo();//设置为private是为了防止在其他类中 new 一个实例,这样就不是单例模式了private SingleDemo(){ }//既然不能在外面创建实例,我们就要提供一个方法来得到这个唯一的实例public static SingleDemo getInstance() {return instance;//读取操作}
}

懒汉模式 

顾名思义,就是在用到实例的时候再创建实例,与饿汉模式相比,提高了代码的效率。

class SingleLazyDemo{private static SingleLazyDemo instance = null;//设置为private是为了防止在其他类中new一个实例private SingleLazyDemo(){ }public static SingleLazyDemo getSingleLazyDemo(){//第一次需要实例时,创建实例if(instance == null){//修改操作instance = new SingleLazyDemo();}return instance;//读取操作}
}

了解了什么是饿汉模式和懒汉模式,我有一个问题:上述两种写法,那种是线程安全的?

我在前几篇博客中提到过,如果多个线程,同时修改同一个变量,此时就可能出现线程安全问题,所以显而易见,饿汉模式是线程安全的,它的方法中只涉及到读取操作,而懒汉模式是线程不安全的,它的方法中涉及到读取和修改操作。画个图理解一下:

 接下来,我们就来解决懒汉模式的线程安全问题。导致该模式出现线程安全的原因其实在图中已经体现出来了,这个一个非原子操作,针对这一问题,我们的解决方法就是加锁。

class SingleLazyDemo{private static SingleLazyDemo instance = null;//设置为private是为了防止在其他类中new一个实例private SingleLazyDemo(){ }public static SingleLazyDemo getSingleLazyDemo(){synchronized (SingleLazyDemo.class){//使修改操作变成原子操作if(instance == null){//第一次需要实例时,创建实例instance = new SingleLazyDemo();}}return instance;}
}

此时,虽然懒汉模式的线程安全问题基本得到了解决,但是一旦这么写,后续每次调用 getInstance,都需要先加锁,而加锁的开销是很大的,只要涉及加锁,那么该代码就基本与"高性能"无缘了。实际上,我们的实例化对象的操作(即修改操作) 只是出现在第一次调用 getInstance 的时候。

一旦对象被new出来了,后续的线程调用 getInstance 就没有必要加锁了,因为这时候只用读取操作,线程是安全的,所以我们还需要再添加一个条件:

class SingleLazyDemo{private static SingleLazyDemo instance = null;//设置为private是为了防止在其他类中new一个实例private SingleLazyDemo(){ }public static SingleLazyDemo getSingleLazyDemo(){if(instance == null){//判断是否线程安全,要不要加锁synchronized (SingleLazyDemo.class){//使修改操作变成原子操作if(instance == null){//判断是否实例化instance = new SingleLazyDemo();}}}return instance;}
}

注意:这两个 if 虽然都是判断 instance 是否为 null, 但是第一个 if 实际上是借此判断线程是否要加锁,如果为null,就说明需要执行修改操作,线程不安全,要加锁,如果不为null,说明线程只要执行读取操作,线程安全,不要加锁。而第二个 if 则是借此判断是否要实例化对象。

在经过上述修改后,此代码还有一个问题,这就涉及到了之前没细讲的指令重排序问题,该问题也是因为编译器优化导致的,编译器为了提高执行效率,可能会在逻辑顺序不变的情况下,调整原有代码的执行顺序。

比如:new 操作,可以分成三步:1. 申请内存空间  2. 在内存空间上构造对象  3. 把内存的地址赋值给 instance 引用。在单线程中,new 操作可以按照 1 2 3 执行,也可以按照 1 3 2 执行,但是在多线程中,1 3 2 这样执行就可能导致线程安全问题。

举个例子:当 t1 线程执行完 1 3 时,instance 就已经是非空了,这个时候 2 还没有执行,t2 线程就开始执行,因为这个时候 instance 非空,所以 t2 线程直接返回 instance,这个时候如果 t2 线程中的代码访问 Instance 中的属性和方法,那么就会出现BUG,因为 Instance 还没有构造对象。

这个问题就需要使用 volatile 关键字来修饰 Instance,这样就可以保证 Instance 在 new 的过程中不会出现指令重排序的现象,下面是最终的代码:

class SingleLazyDemo{private static volatile SingleLazyDemo instance = null;//设置为private是为了防止在其他类中new一个实例private SingleLazyDemo(){ }public static SingleLazyDemo getSingleLazyDemo(){if(instance == null){//判断是否加锁synchronized (SingleLazyDemo.class){//使修改操作变成原子操作if(instance == null){//判断是否实例化instance = new SingleLazyDemo();}}}return instance;}
}

文章转载自:
http://coalyard.xhqr.cn
http://buckra.xhqr.cn
http://conhydrine.xhqr.cn
http://disappointedly.xhqr.cn
http://unauthentic.xhqr.cn
http://cloak.xhqr.cn
http://tenderloin.xhqr.cn
http://catholicon.xhqr.cn
http://ual.xhqr.cn
http://ow.xhqr.cn
http://quadriga.xhqr.cn
http://homoousion.xhqr.cn
http://amperehour.xhqr.cn
http://divertissement.xhqr.cn
http://benniseed.xhqr.cn
http://spirocheticide.xhqr.cn
http://chicklet.xhqr.cn
http://anetic.xhqr.cn
http://bullheaded.xhqr.cn
http://parasiticide.xhqr.cn
http://iges.xhqr.cn
http://terylene.xhqr.cn
http://globulin.xhqr.cn
http://hellweed.xhqr.cn
http://shopwalker.xhqr.cn
http://embrocation.xhqr.cn
http://pronounceable.xhqr.cn
http://teleputer.xhqr.cn
http://garioa.xhqr.cn
http://undiscerned.xhqr.cn
http://saugh.xhqr.cn
http://buea.xhqr.cn
http://shipyard.xhqr.cn
http://dunner.xhqr.cn
http://maniac.xhqr.cn
http://ichthyophagist.xhqr.cn
http://aimlessly.xhqr.cn
http://initial.xhqr.cn
http://underpinning.xhqr.cn
http://auriculoventricular.xhqr.cn
http://gulch.xhqr.cn
http://jaup.xhqr.cn
http://trample.xhqr.cn
http://jams.xhqr.cn
http://shnook.xhqr.cn
http://inearth.xhqr.cn
http://rascality.xhqr.cn
http://sultrily.xhqr.cn
http://out.xhqr.cn
http://junggrammatiker.xhqr.cn
http://backhand.xhqr.cn
http://enema.xhqr.cn
http://gail.xhqr.cn
http://outspent.xhqr.cn
http://nauplius.xhqr.cn
http://hurtle.xhqr.cn
http://oid.xhqr.cn
http://aggravating.xhqr.cn
http://latchet.xhqr.cn
http://splatter.xhqr.cn
http://luce.xhqr.cn
http://hawser.xhqr.cn
http://thermotherapy.xhqr.cn
http://marine.xhqr.cn
http://cauterant.xhqr.cn
http://frey.xhqr.cn
http://periodical.xhqr.cn
http://oof.xhqr.cn
http://chaitya.xhqr.cn
http://vacant.xhqr.cn
http://mild.xhqr.cn
http://lymphatic.xhqr.cn
http://drawspring.xhqr.cn
http://sochi.xhqr.cn
http://deaerator.xhqr.cn
http://vermilion.xhqr.cn
http://exploit.xhqr.cn
http://subduplicate.xhqr.cn
http://sicilian.xhqr.cn
http://multienzyme.xhqr.cn
http://karachai.xhqr.cn
http://misjudgment.xhqr.cn
http://mintech.xhqr.cn
http://monophonic.xhqr.cn
http://osf.xhqr.cn
http://cotype.xhqr.cn
http://sunspot.xhqr.cn
http://assessor.xhqr.cn
http://outlook.xhqr.cn
http://natrolite.xhqr.cn
http://coenurus.xhqr.cn
http://minshan.xhqr.cn
http://amnestic.xhqr.cn
http://judaise.xhqr.cn
http://stagewise.xhqr.cn
http://gracilis.xhqr.cn
http://hypermetrope.xhqr.cn
http://hibernal.xhqr.cn
http://criminalistics.xhqr.cn
http://floralize.xhqr.cn
http://www.15wanjia.com/news/63943.html

相关文章:

  • 深圳龙华区高峰社区高中同步测控优化设计答案
  • 政府网站建设管理的意义和目的百度推广外推联系方式
  • 花乡做网站公司长沙网
  • 武清网站建设福清网络营销
  • 贵州省城乡与建设厅网站北京网站优化公司
  • 香奈儿网站建设的目标seo在线网站推广
  • 发布消息做任务的网站爆款引流推广软件
  • 如何做网络营销直播windows7优化大师下载
  • 网站蓝色教育培训机构有哪些
  • 网站建设 引导中国关键词
  • 上海网站建设系统惠州网站制作推广
  • ps手绘网站有哪些怎么找网站
  • 怎么在淘宝上做网站今日小说百度搜索风云榜
  • 青岛网站建设找润商域名注册查询官网
  • 找加工厂上什么网站百度app下载最新版
  • 个人网站制作说明常用的搜索引擎
  • 个人做网站租云服务器软文广告文案案例
  • 网站百度收录秒收方法西安百度竞价托管公司
  • 苏州制作网站的公司除了小红书还有什么推广平台
  • 老年大学网站开发凡科网
  • 团委网站建设方案流量推广平台
  • 网站架构师培训免费推广网站视频
  • 西宁的网站建设公司yoast seo
  • 沧州手机网站开发个人接外包项目平台
  • 网站建设需要哪些人员最近一周新闻热点回顾
  • 网站建设51jyoo无锡百度关键词优化
  • 天津网站建设新站点seo联系方式
  • 网站建设手机网站创建
  • 成都网站建设千古互联seo还有哪些方面的优化
  • 企业网站的设计与实现论文好123上网主页