天天看点

Java手写单例之饿汉式、懒汉式、双重判定锁。

Java手写单例之饿汉式、懒汉式、双重判定锁。

package org.fh.action;
/**
 * 饿汉式
 * @author Administrator
 *
 */
public class Singleton {
	/**
	 * 私有的   final 修饰的变量 不能被二次赋值
	 */
	private static final Singleton singleton = new Singleton();
	
	/**
	 * 默认的无参构造
	 */
	private Singleton(){
	}
	
	/**
	 * 公共的方法
	 */
	public static Singleton getInsta(){
		return singleton;
	}
	
}


package org.fh.action;
/**
 * 懒汉式 
 * @author Administrator
 */
public class Singleton2 {
	private static Singleton2 singleton2 = null;
	
	private Singleton2(){
	}
	
	//  加锁
	//  当第一个线程 执行完毕之后,第二个才能进去    弊端效率低
	//	双重判定锁
	public synchronized static Singleton2 getInstance(){
		// 多个线程同时创建 该对象  (线程不安全)
		if(singleton2 == null){
			singleton2 = new Singleton2();
		}
		return singleton2;
	}
}



package org.fh.action;
/**
 * 双重判定锁 (效率高,线程安全)
 * @author Administrator
 *
 */
public class Singleton3 {
	//禁止编译器重排序
	private volatile static Singleton3 singleton3 = null;
	
	private Singleton3(){
		
	}
	//
	public static Singleton3 getInstance(){
		// 执行效率高
		if(singleton3 == null){
			// 第一个线程执行完毕之后,第二个线程才能进去
			synchronized (Singleton3.class) {
				// 保证单例
				if(singleton3 == null){
					singleton3 = new Singleton3();
				}
			}
		}
		return singleton3;
	}
}



package org.fh.action;

import org.fh.model.Book;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

	public static void main(String[] args) {
		//加载spring配置文件
		ClassPathXmlApplicationContext cl = new ClassPathXmlApplicationContext("applicationContext.xml");
		//取对象
		BookAction bookAction = (BookAction) cl.getBean("bookAction");
		
		BookAction bookAction2 = (BookAction) cl.getBean("bookAction");
		
		//对象的哈希吗值一致说明  同一个内存地址
		System.out.println(bookAction);
		
		System.out.println(bookAction2);
		//执行方法
				bookAction.queryBook();
		// true   同一个内存地址
		System.out.println(bookAction == bookAction2);
		
		System.out.println("======================================");
		Book book = new Book();
		Book book2 = new Book();
		
		System.out.println(book);
		System.out.println(book2);
		System.out.println(book == book2);
		
		System.out.println("======================================");
		
		//创建的该类的无参构造
		//Singleton singleton = new Singleton();
		
		Singleton insta = Singleton.getInsta();
		Singleton insta2 = Singleton.getInsta();
		System.out.println(insta);
		System.out.println(insta2);
		
		System.out.println(insta == insta2);
		System.out.println("======================================");
		
		Singleton2 instance = Singleton2.getInstance();
		Singleton2 instance2 = Singleton2.getInstance();
		System.out.println(instance);
		System.out.println(instance2);
		//equals  比较的是内容     ==  比较的是内存地址
		System.out.println(instance == instance2);
		
	}
}

           

继续阅读