`

线程锁synchronized在单例模式三种创建方式上的应用

 
阅读更多

 

 

 

 

单例模式三种创建模式:

 

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;
	}

}

 

 

 

分享到:
评论

相关推荐

    二十三种设计模式【PDF版】

    实际上,GoF 的设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用 和智慧,让你能够真正掌握接口或抽象类的应用,从而在原来的 Java 语言基础上跃进一步,更重要的是...

    DesignPattern:Java设计模式

    单例模式 多线程时是否重复创建单例对象 加载类的速度 运行时获取对象的速度 线程安全 代码链接 适用情形 其它 懒汉模式 会 快 慢 否 某个单例用的次数不是很多,但是这个单例提供的功能又非常复杂,而且加载和初始...

    超级有影响力霸气的Java面试题大全文档

    ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector...

    Java并发编程原理与实战

    多种创建线程的方式案例演示(一)带返回值的方式.mp4 多种创建线程的方式案例演示(二)使用线程池.mp4 Spring对并发的支持:Spring的异步任务.mp4 使用jdk8提供的lambda进行并行计算.mp4 了解多线程所带来的安全...

    java面试题

    Struts1只是在第一次请求的时候创建一个action实例,以后每次相同的请求都直接从内存中去读取,它是单例模式,安全性较差。 Struts2是如何实现MVC模式的? 答:在Struts2里面是将每次页面的请求进行处理,然后将请求...

    java面试800题

    factory工厂模式、prototype原始模型模式、singleton单例模式、builder建造模式 结构模式 facade门面模式、proxy代理模式、adapter适配器(变压器)模式、composite合成模式、decorator装饰模式、bridge桥梁模式、...

    java 面试题 总结

    当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 17、abstract class和interface有什么区别? 声明方法...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【多线程】Java四种线程池的创建方法 83 【多线程】线程池原理和运行机制 83 【多线程】线程池对任务的处理 85 【多线程】线程池的状态 86 线程池的状态说明 86 各个状态之间的转换 86 【多线程】什么是线程池?如果...

    龙果 java并发编程原理实战

    第7节多种创建线程的方式案例演示(一)带返回值的方式00:17:12分钟 | 第8节多种创建线程的方式案例演示(二)使用线程池00:15:40分钟 | 第9节Spring对并发的支持:Spring的异步任务00:11:10分钟 | 第10节使用jdk...

    Java 并发编程原理与实战视频

    第7节多种创建线程的方式案例演示(一)带返回值的方式00:17:12分钟 | 第8节多种创建线程的方式案例演示(二)使用线程池00:15:40分钟 | 第9节Spring对并发的支持:Spring的异步任务00:11:10分钟 | 第10节使用jdk...

    龙果java并发编程完整视频

    第7节多种创建线程的方式案例演示(一)带返回值的方式00:17:12分钟 | 第8节多种创建线程的方式案例演示(二)使用线程池00:15:40分钟 | 第9节Spring对并发的支持:Spring的异步任务00:11:10分钟 | 第10节使用jdk...

    java并发编程

    第7节多种创建线程的方式案例演示(一)带返回值的方式00:17:12分钟 | 第8节多种创建线程的方式案例演示(二)使用线程池00:15:40分钟 | 第9节Spring对并发的支持:Spring的异步任务00:11:10分钟 | 第10节使用jdk...

    JAVA核心知识点整理(有效)

    2.1. 线程 ...................................................................................................................................................... 20 2.2. JVM 内存区域 .....................

Global site tag (gtag.js) - Google Analytics