单例模式三种创建模式:
1 饿汉式 ---> 双重判空机制
双重判空: 第一次初始化对象时在并发下防止重复创建对象,
第二个判空是为后来者提供快速得到初始化实例的切口,
防止每次获取实例都持有synchroinzed
2 饿汉式 ----> 交给JVM操作,在类被加载到时就初始化好
3 延迟加载 ----> 锁交给JVM操作,但是是在真正使用到实例的时候 才让JVM给实例化好:
4 代码:
/** * 单例创建的方式 * 1、懒汉式 * 1)、构造器私有化 * 2)、声明私有的静态属性 * 3)、对外提供访问属性的静态方法,确保该对象存在 * * @author Administrator * */ public class MyJvm { private static MyJvm instance; private MyJvm(){ } public static MyJvm getInstance (){ if(null==instance){ //提供效率 ---> 为后来线程做准备,当前面线程已经创建好了对象后,后来线程不需要直接在进入19行进入等待队列,直接在18行转变行动方向得到instance即可 synchronized(MyJvm.class){ if(null==instance){ //安全 ---> 为第一次同时的拍的等待分配CPU进入锁对象时,第一个线程释放锁后,第二个线程得到进入时需要一个判空 instance =new MyJvm(); } } } return instance; } } /** * 饿汉式 1)、构造器私有化 * 2)、声明私有的静态属性,同时创建该对象 * 3)、对外提供访问属性的静态方法 * @author Administrator * */ class MyJvm2 { private static MyJvm2 instance =new MyJvm2(); // static资源在JVM加载类时就已经初始化好了,即加锁任务交给了JVM 因此不再需要synchronized private MyJvm2(){ } public static MyJvm2 getInstance (){ return instance; } } /** * 类在使用的时候加载 ,延缓加载时间 同样将锁交给JVM实现(static关键词是提醒) * @author Administrator * */ class MyJvm3 { private static class JVMholder{ private static MyJvm3 instance =new MyJvm3(); } private MyJvm3(){ } public static MyJvm3 getInstance (){ return JVMholder.instance; } }
相关推荐
实际上,GoF 的设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用 和智慧,让你能够真正掌握接口或抽象类的应用,从而在原来的 Java 语言基础上跃进一步,更重要的是...
单例模式 多线程时是否重复创建单例对象 加载类的速度 运行时获取对象的速度 线程安全 代码链接 适用情形 其它 懒汉模式 会 快 慢 否 某个单例用的次数不是很多,但是这个单例提供的功能又非常复杂,而且加载和初始...
ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector...
多种创建线程的方式案例演示(一)带返回值的方式.mp4 多种创建线程的方式案例演示(二)使用线程池.mp4 Spring对并发的支持:Spring的异步任务.mp4 使用jdk8提供的lambda进行并行计算.mp4 了解多线程所带来的安全...
Struts1只是在第一次请求的时候创建一个action实例,以后每次相同的请求都直接从内存中去读取,它是单例模式,安全性较差。 Struts2是如何实现MVC模式的? 答:在Struts2里面是将每次页面的请求进行处理,然后将请求...
factory工厂模式、prototype原始模型模式、singleton单例模式、builder建造模式 结构模式 facade门面模式、proxy代理模式、adapter适配器(变压器)模式、composite合成模式、decorator装饰模式、bridge桥梁模式、...
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 17、abstract class和interface有什么区别? 声明方法...
【多线程】Java四种线程池的创建方法 83 【多线程】线程池原理和运行机制 83 【多线程】线程池对任务的处理 85 【多线程】线程池的状态 86 线程池的状态说明 86 各个状态之间的转换 86 【多线程】什么是线程池?如果...
第7节多种创建线程的方式案例演示(一)带返回值的方式00:17:12分钟 | 第8节多种创建线程的方式案例演示(二)使用线程池00:15:40分钟 | 第9节Spring对并发的支持:Spring的异步任务00:11:10分钟 | 第10节使用jdk...
第7节多种创建线程的方式案例演示(一)带返回值的方式00:17:12分钟 | 第8节多种创建线程的方式案例演示(二)使用线程池00:15:40分钟 | 第9节Spring对并发的支持:Spring的异步任务00:11:10分钟 | 第10节使用jdk...
第7节多种创建线程的方式案例演示(一)带返回值的方式00:17:12分钟 | 第8节多种创建线程的方式案例演示(二)使用线程池00:15:40分钟 | 第9节Spring对并发的支持:Spring的异步任务00:11:10分钟 | 第10节使用jdk...
第7节多种创建线程的方式案例演示(一)带返回值的方式00:17:12分钟 | 第8节多种创建线程的方式案例演示(二)使用线程池00:15:40分钟 | 第9节Spring对并发的支持:Spring的异步任务00:11:10分钟 | 第10节使用jdk...
2.1. 线程 ...................................................................................................................................................... 20 2.2. JVM 内存区域 .....................