java单例模式
来源:互联网 发布:我的失恋 知乎 编辑:程序博客网 时间:2024/06/05 04:53
java单例模式
什么是java单例模式?
java单例模式就是任何适合保证为整个程序提供一个实例,避免不一致的状态。
实现的思路就是让构造函数私有化,通过函数返回当前类的实例。
饿汉式单例实现
public class Singleton { private static Singleton instance = new Singleton(); private Singleton(){} public static Singleton getInstance() { return instance; } }
通过直接在类中初始化实例,并且设定为static的方式,从而达到只输出一个实例的目的。
懒汉式单例实现
懒汉式单例是指在方法调用获取实例时才创建实例,所以比较懒
public class Singleton { private static Singleton instance = null; private Singleton (){} public static Singleton getInstance() { if(instance == null){ //只有进去的时候才创建实例 instance = new Singleton (); } return instance; } }
以上代码在单线程中是完全正确的,但是如果正在多线程并发的条件下,如果有几个线程同时进入到了类中,同时进行耗时操作,将会返回多个实例,所以这种用法不适合用于多线程中。
线程安全的懒汉式单例
既然以上的方法存在问题,那我们为了防止产生多个实例,可以在上面加上锁,简单的改动可以让代码能够运行
public class Singleton { private synchronized static Singleton instance = null; private Singleton (){} public static Singleton getInstance() { if(instance == null){ //只有进去的时候才创建实例 instance = new Singleton (); } return instance; } }
虽然上面的代码实现了线程安全,但是确实牺牲了效率,同步效率很低。
双检查锁机制
public class Singleton { //使用volatile关键字保其可见性 volatile private static Singleton instance = null; private Singleton (){} public static Singleton getInstance() { try { if(instance != null){ }else{ Thread.sleep(300); synchronized (Singleton.class) { if(instance == null){ //二次检查 instance = new Singleton(); } } } } catch (InterruptedException e) { e.printStackTrace(); } return instance; } }
以上代码通过同步代码块和volatile关键字,仅仅对 if(instance == null){
instance = new Singleton(); } 方法加锁,从而达到了,效率和安全的作用。
阅读全文
0 0
- java单例模式
- Java单例模式
- java单例模式
- java单例模式
- Java单例模式
- Java单例模式
- java单例模式
- Java单例模式
- java 单例模式
- java单例模式
- java单例模式
- java单例模式
- java 单例模式
- JAVA单例模式
- java单例模式 .
- Java 单例模式
- Java单例模式
- Java 单例模式
- PAT-1047(编程团体赛)
- Volley
- js获取一个元素节点的子节点的方法(包括非文本节点)
- python之面向对象知识点总结
- HDU
- java单例模式
- Java中字符串内存位置
- javac 编译原理
- hdu 6181
- POJ-3468 A Simple Problem with Integers(分块 区间加+区间查询)
- udp数据报从网卡驱动到用户空间流程总结
- java 中switch基本用法
- 实体类的变量名称一定是小写!
- 关系运算