线程锁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;
	}

}

相关推荐