javase之单例设计模式

1、懒汉式单例模式(在多线程里面就会不是一个对象了,进行加锁,加锁后效率降低,进行双重检查提高效率)

package com.ljl.thread;

/**
 * 单例设计模式
 * 确保一个类只有一个对象
 * @author Richard
 *
 */
public class SynDemo2 {
	public static void main(String[] args) {
		Jvm jvm1=Jvm.getInstance();
		Jvm jvm2=Jvm.getInstance();
		System.out.println(jvm1);
		System.out.println(jvm2);
	}

}
/**
 * 
 * 一个类只有一个对象
 * @author Richard
 * 懒汉式
 * 1)构造器私有化,避免外部直接创建对象
 * 2)声明一个私有的静态变量
 * 3)创建一个对外的公共的静态方法访问该变量,如果变量没有对象,创建该对象
 */
class Jvm{
	//声明一个私有的静态变量
	private static Jvm instance=null;//这里懒得创建对象,在你使用得时候创建对象
	//构造器私有化,避免外部直接创建对象
	private Jvm() {
		
	}
	//创建一个对外的公共的静态方法访问该变量,如果变量没有对象,创建该对象
	public static Jvm getInstance() {
		if (null==instance) {
			instance=new Jvm();
		}
		return instance;
	}
}

package com.ljl.thread;

import java.sql.Time;

/**
 * 单例设计模式
 * 确保一个类只有一个对象
 * @author Richard
 *
 */
public class SynDemo2 {
	public static void main(String[] args) {
		JvmThread thread1=new JvmThread(100);
		JvmThread thread2=new JvmThread(500);
		thread1.start();
		thread2.start();
	}
}
class JvmThread extends Thread{
	private long time;

	public JvmThread() {
	}
	public JvmThread(long time) {
		this.time=time;
	}
	@Override
		public void run() {
			System.out.println(Thread.currentThread().getName()+"创建"+Jvm.getInstance(time));
		}
}

/**
 * 
 * 一个类只有一个对象
 * @author Richard
 * 懒汉式
 * 1)构造器私有化,避免外部直接创建对象
 * 2)声明一个私有的静态变量
 * 3)创建一个对外的公共的静态方法访问该变量,如果变量没有对象,创建该对象
 */
class Jvm{
	//声明一个私有的静态变量
	private static Jvm instance=null;//这里懒得创建对象,在你使用得时候创建对象
	//构造器私有化,避免外部直接创建对象
	private Jvm() {
		
	}
	//创建一个对外的公共的静态方法访问该变量,如果变量没有对象,创建该对象
	public static synchronized Jvm getInstance(long time) {
		if (null==instance) {
			try {
				Thread.sleep(time);//延时,放大发生错误的概率
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			instance=new Jvm();
		}
		return instance;
	}
	//创建一个对外的公共的静态方法访问该变量,如果变量没有对象,创建该对象
	public static  Jvm getInstance2(long time) {
		synchronized(Jvm.class) {
			if (null==instance) {
				try {
					Thread.sleep(time);//延时,放大发生错误的概率
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
				instance=new Jvm();
			}
			return instance;
		}
	}
	//创建一个对外的公共的静态方法访问该变量,如果变量没有对象,创建该对象
	public static  Jvm getInstance3(long time) {
		if(null==instance) {//经典的双重检查(double checking)
			synchronized(Jvm.class) {
				if (null==instance) {
					try {
						Thread.sleep(time);//延时,放大发生错误的概率
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
					instance=new Jvm();
				}
			}
		}
		return instance;
	}
}

猜你喜欢

转载自blog.csdn.net/Richard_666/article/details/87903122
今日推荐