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

祭奠祭祀网站开发功能需求新浪网今日乌鲁木齐新闻

祭奠祭祀网站开发功能需求,新浪网今日乌鲁木齐新闻,做电台需要的文章从哪个网站找,google独立站单例模式 单例模式饿汉式懒汉式 单例模式 解释:一个类只能有一个实例 单例模式可以分为两种 饿汉式 和 懒汉式 饿汉式 也被称为预加载,即 在加载类的时候,就将实例创建出来,加载到内存,不管之后会不会使用这个实例 …

单例模式

  • 单例模式
    • 饿汉式
    • 懒汉式

单例模式

解释:一个类只能有一个实例
单例模式可以分为两种 饿汉式懒汉式

饿汉式

也被称为预加载,即 在加载类的时候,就将实例创建出来,加载到内存,不管之后会不会使用这个实例
主打一个饥不择食,体现了贪心的思想。

public class HungrySingleton {//方式1:静态变量private static HungrySingleton instance = new HungrySingleton();//方式2:静态代码块/*static {instance = new HungrySingleton();}*///方式3:枚举,可以看 EnumSingleton.classpublic static HungrySingleton getInstance(){return instance;}
}

很明显,我们还没有使用该对象,就已经加载到了内存,浪费内存
但是,同时,因为只有一此创建对象,所以饿汉式是线程安全的

懒汉式

也成为懒加载,即:只有在使用该类时才创建需要的对象
我很懒,你不用我,我就不创建对象

一般有四种实现方式

  1. 简单懒汉式,不能用,线程不安全
  2. Synchronized 同步方法,一般不用,线程安全,但锁粒度太大,效率较低
  3. 双重检查锁,可以用,注意使用volatile 关键字保证单例对象的原子性
  4. 静态内部类,推荐使用
public class LazySingleton {private volatile static LazySingleton instance;/*** 简单懒汉式* 问题:线程不安全,一般不用* @return*/public static LazySingleton getInstance01() {if(null == instance){instance = new LazySingleton();}return instance;}/*** synchronized* 解决了线程安全问题,但效率低,一般不用* @return*/public synchronized static LazySingleton getInstance02() {if(null == instance){instance = new LazySingleton();}return instance;}/*** 双重检查锁模式* 降低锁的粒度,只锁创建对象的代码块* 需要增加 volatile 来保证原子性,防止jvm指令重排,但同时屏蔽了JVM的一些代码优化* @return*/public static LazySingleton getInstance03() {if(null == instance){synchronized (LazySingleton.class){if(null == instance){//防止重复创建对象instance = new LazySingleton();}}}return instance;}/*** 静态内部类方式* 只有在使用时才会创建静态内部类,推荐使用* @return*/public static LazySingleton getInstance04() {return SingletonHolder.INSTANCE;}private static class SingletonHolder{private static final LazySingleton INSTANCE = new LazySingleton();}
}

这里解释下 为什么 双重检查锁要 使用 volatile 关键字 修饰单例对象
if判断以及其内存执行代码是非原子性的。其次,new LazySingleton()无法保证执行的顺序性。
显然,不满足原子性或者顺序性,线程肯定是不安全的。
下面主要讲一下 new LazySingleton() 为什么不能保证顺序性。
设想一下,创建一个对象,应该分为几步?
答案是三步,如下:

memory=allocate();//1:初始化内存空间
ctorInstance(memory);//2:初始化对象
instance=memory();//3:设置instance指向刚分配的内存地址

jvm为了提高程序执行性能,会对没有依赖关系的代码进行重排序,也就是说上面2和3行代码可能被重新排序。
我用两个线程举例:

时间片线程A线程B
t1初始化内存空间
t2设置instance指向刚分配的内存地址
t3判断instance 是否为空
t4由于instanc不为空,获取到一个空的实例化对象(线程不安全
t5初始化对象

volatile 关键字就是强制要求jvm 不进行指令重排,按顺序执行,当然也有一定的性能损失
volatile 其他相关知识 可以参考以下文章:
https://blog.csdn.net/m0_50370837/article/details/124380385

http://www.zhongyajixie.com/news/28722.html

相关文章:

  • 怎么做网页聊天室南宁seo平台标准
  • 源码出售网站seo快排优化
  • 快速做自适应网站营销策略都有哪些
  • 东台专业做网站的公司品牌营销理论有哪些
  • 域名备案通过后怎么做网站条友网
  • 怎样自己做公司网站百seo排名优化
  • 做大数据和网站开发的前景关键一招
  • 小鱼在线网站建设国家卫生健康委
  • 嘉兴地区有人做网站吗公司网络营销推广方案
  • 阿里云的网站建设好不好黑帽seo技巧
  • 格拉苏蒂手表网站软媒win7优化大师
  • 专业网站优化公司排名女教师遭网课入侵直播录屏曝光视频
  • 网站建设资料企业官网搭建
  • 网站策划报价模板长沙做搜索引擎的公司
  • 建企业网站行业网seo综合查询接口
  • 给公司做网站需要多少钱专业搜索引擎seo服务
  • 邢台营销型网站制作怎么seo关键词优化排名
  • dedecms图片网站模板关键词排名点击软件
  • 变装WordPress关键词优化包含
  • 建设银行的财务网站情感营销
  • 东莞vi设计公司排名seo网络推广哪家专业
  • 宣传类的网站有哪些内容河北百度代理公司
  • 青海公司网站建设哪家快线上宣传渠道
  • 广州网站建设海珠信科中国最新消息
  • 做土建资料有什么网站没英文seo外链发布工具
  • seo公司厦门百度搜索引擎优化的方法
  • 做蛋糕有哪些网站google chrome download
  • 网站备案需要几天网站宣传文案范例
  • 宁波外贸网站推广优化互联网推广的优势
  • 重庆做网站开发的集中球队世界排名榜