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

哈尔滨企业建站服务商蒙icp备网站建设

哈尔滨企业建站服务商,蒙icp备网站建设,转转免费假链接制作器,设置自动删除的wordpress在整个程序中,保持只有一个实例对象,就是单例模式。 单例模式可以减少构建,GC的次数,提升性能,还能减少堆内存的开销。 1. 懒汉式 在需要使用对象的时候,才进行创建 通过private构造方法,确保…

在整个程序中,保持只有一个实例对象,就是单例模式。

单例模式可以减少构建,GC的次数,提升性能,还能减少堆内存的开销。

1. 懒汉式

  • 在需要使用对象的时候,才进行创建

  • 通过private构造方法,确保外部不能new出对象,通过一个静态方法进行对象获取。

public  class LazySingleton implements Serializable {private static LazySingleton lazySingleton = null;private  LazySingleton() {}public  static LazySingleton  getInstance(){if(lazySingleton == null){lazySingleton = new LazySingleton();}return lazySingleton;}
}

 需要注意的是,懒汉式是线程不安全的,并发情况下有线程安全问题,需要进行同步处理。

可以在getInstance()方法上加上synchronized。但是锁的粒度很大,所以引出了双重检查锁

2. 双重检查锁

  • 通过两个if判断,加上同步锁进行实现
  • 只进行一次判断上锁的话,上锁解锁后,单例对象就被重置了,因为有可能多个线程同时都通过了第一次判断,只是没抢到锁
  • 而且,需要加上volatile保证可见性和同步性,因为锁住的是class对象,不是单例对象,所以JMM保证的unlock刷到主存,lock读到工作内存只对class对象起作用,单例对象的可见性无法保证,同样的,是class对象的unlock操作在lock操作之前,happens before原则也无法保证有序性,因为整个临界区内根本找不到一个和class对象相关的操作。
public class DoubleCheckSingleton {private static volatile  DoubleCheckSingleton doubleCheckSingleton ;private DoubleCheckSingleton(){}public static DoubleCheckSingleton getInstance(){if(doubleCheckSingleton ==null){synchronized (DoubleCheckSingleton.class){if (doubleCheckSingleton == null){doubleCheckSingleton = new DoubleCheckSingleton();}}}return doubleCheckSingleton;}
}

 3. 静态内部类

双重检查锁对于同步控制特别的复杂繁琐,有没有什么底层已经进行了的同步操作可以利用的呢?

答案是类加载的loadclass是被synchronized修饰的,类的加载是同步的,类加载进行到初始化部分的时候会对静态变量赋初始值,也会执行静态代码块。

  • 在单例类中,通过私有的静态内部类,创建单例对象

  • 静态内部类只有在被调用的时候才会被加载,实现了懒加载。

public class StaticInnerClassSingleton {/*** 第一次被调用到的时候才会进行类加载,进行初始化(JVM相关知识,加载、连接(验证,准备,解析)、初始化(为静态变量赋值)*/private static class InnerClass{private static final StaticInnerClassSingleton staticInnerClassSingleton = new StaticInnerClassSingleton();}private StaticInnerClassSingleton(){System.out.println("StaticInnerClassSingleton初始化......");}public static StaticInnerClassSingleton getInstance(){return InnerClass.staticInnerClassSingleton;}
}

4. 饿汉式

如果不追求懒加载,那么还是使用类加载的同步控制的话,直接在单例类放一个静态变量,或者在静态代码块进行初始化。

public class HungrySingleton {private static final HungrySingleton hungrySingleton ;static {hungrySingleton = new HungrySingleton();}private HungrySingleton(){System.out.println("HungrySingleton初始化.....");}public static HungrySingleton getInstance(){return hungrySingleton;}
}

5. 枚举

前面一步一步的推导出到了饿汉式,看着很完美了,但是单例模式会被反射破坏。通过反射获取到构造函数后,可以强制开启权限执行。序列化和反序列化也都是基于反射创建对象的。

那么什么单例模式不会有这样的情况呢?

枚举。枚举是最佳的单例模式实现方式。

枚举在底层的构造函数是强制private的,反射无法打开权限,枚举对象的反序列化是通过name在堆内找到对应的对象

public enum EnumSingleton implements Serializable {EnumSingleton("枚举单例");private String name;EnumSingleton() {}EnumSingleton(String name) {this.name = name;}public void doSomething(String something) {System.out.println(name + ":" + something);}
}

http://www.yayakq.cn/news/833239/

相关文章:

  • 怎样做58网站深紫色网站
  • 建网站教学长沙企业建站系统
  • vr全景网站开发制作jsp网站建设项目实战课本内容
  • 芜湖网站建设whwzjs网站如何管理
  • 珠海市品牌网站建设平台wap自助建站
  • 适合用于网站开发的工具芜湖做公司网站
  • 网站建设宣传册内容微信里的小程序游戏
  • 网站建好了怎么做网站开发用笔记本电脑
  • 安卓软件下载用什么好潍坊seo关键词排名
  • ipv6 网站开发百度极速版免费下载
  • 怎么做企业曝光引流网站自己建一个网站能过期吗
  • 增城百度做网站多少钱怎么联系软件开发者
  • 网站建设本科毕业设计论文网站建设jz518
  • 美了一站式变美共享平台满山红厦门网站建设
  • 外贸网站建设报价差别那么大花钱多吃亏大良网站建设
  • 关于做网站的文献综述安徽服装网站建设
  • 做企业网站都需要注意哪点长沙注册公司核名网站
  • 易县做网站吸引企业做网站的文章内容
  • 网站怎么可以做视频播放网页设计需要用什么软件
  • 黄石企业做网站手机网站生成工具
  • 简要叙述如何规划建设一个企业网站全球十大搜索引擎排名
  • 苏州网站建设方案策划哪家网络推广公司好
  • 外贸网站sns一个地址能注册几个公司
  • 公司手机网站制作常见的办公网网站开发
  • 梓潼销售网站建设哪家专业网站侧边栏代码
  • html5做网站好吗做电影网站需要用什么空间
  • 各大行业网站网站开发路径
  • 建设银行管方网站wordpress引导页插件
  • 高端型网站注册商标怎么注册商标
  • 建站之星管理中心企业qq怎么申请注册