java单例模式
来源:互联网 发布:电脑温度监控软件 编辑:程序博客网 时间:2024/05/16 01:21
java单例模式
标签(空格分隔): java 单例 设计模式
- java单例模式
- 概念
- 实现思路
- 饿汉式
- 懒汉式
- 双重检查加锁
–
概念
单例模式 指的是一个类只有一个实例,并且提供一个全局访问点
实现思路
- 在单例模式的类中设置一个private静态变量field,类型为当前类,用来持有单例唯一的实例
- 同时将无参数的构造函数访问修饰符设置为private,避免外部使用new构造多个实例
- 提供一个public静态方法用于返回该类的唯一实例
饿汉式
指的式单例的实例在类装载时进行创建
如下:
public class SingleInstance { //定义一个静态的私有的该类类型的field字段 private static SingleInstance sInstance = new SingleInstance(); //私有无参构造器 private SingleInstance() { } //提供共有的静态访问方法 public static SingleInstance getSinstance() { return sInstance; }}
- 常常用于单例类的构造方法中没有太多的处理逻辑,因为如果存在过多的处理,会导致加载这个类比较慢,影响性能
- 使用饿汉式,只进行了类的装载,并没有实质的调用,造成资源的浪费
懒汉式
指在第一次使用时进行创建,避免了饿汉式遇到的问题
如下:
public class SingleInstance { //定义一个静态的私有的该类类型的field字段 private static SingleInstance sInstance; //私有无参构造器 private SingleInstance() { } //提供共有的静态访问方法 public static SingleInstance getSinstance() { if (null == sInstance) { sInstance = new SingleInstance(); } return sInstance; }}
懒汉式在遇到多线程的并发操作时,可能会造成多个实例的产生,所以保证多线程产生单例的方法就是使用Synchronized修饰getSinstance()方法,即如下代码:
public class SingleInstance { //定义一个静态的私有的该类类型的field字段 private static SingleInstance sInstance; //私有无参构造器 private SingleInstance() { } //提供共有的静态访问方法 public static synchronized SingleInstance getSinstance() { if (null == sInstance) { sInstance = new SingleInstance(); } return sInstance; }}
保证安全之后性能必然下降,同时改方法是一个被频繁调用的方法,所以不推荐这样使用。
双重检查加锁
首先进入该方法时进行null == sInstance检查,如果第一次检查通过,即没有创建实例,则进入synchronized控制的代码同步块,并再次检查实例是否创建,如果仍为创建,则创建该实例,如下:
public class SingleInstance { //定义一个静态的私有的该类类型的field字段 private static SingleInstance sInstance; //私有无参构造器 private SingleInstance() { } //提供共有的静态访问方法 public static synchronized SingleInstance getSinstance() { if (null == sInstance) { synchronized (SingleInstance.class) { if (null == sInstance) { sInstance = new SingleInstance(); } } } return sInstance; }}
该机制保证了多线程下只创建一个实例,并且加锁代码只在实力创建的之前进行同步。如果实例已经创建,进入该方法,则不会执行同步代码
0 0
- java单例模式
- Java单例模式
- java单例模式
- java单例模式
- Java单例模式
- Java单例模式
- java单例模式
- Java单例模式
- java 单例模式
- java单例模式
- java单例模式
- java单例模式
- java 单例模式
- JAVA单例模式
- java单例模式 .
- Java 单例模式
- Java单例模式
- Java 单例模式
- Tsinsen A1320 Painting 【最大权匹配】【树形DP】
- css overflow:hidden为什么会失效
- SVM
- iOS中几种定时器
- C语言中exit(1)和exit(0)的区别
- java单例模式
- IO流的区别和选择
- 123
- UITextField 控制文本输入小数点和小数点后几位
- ARM平台移植strace-4.11
- Linux下vsftp 的配置
- 欢迎使用CSDN-markdown编辑器
- python包sk-learn中的随机森林
- C标签和s标签的对比,特别是里面的if判断条件的写法