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