一、Java设计模式之单例
1、懒汉式单例
案例代码一
package hbase.utils;
public class SingletonDemo1 {
private static SingletonDemo1 instance;
private SingletonDemo1(){
}
/**
* 在此这个单例任然不是线程安全的,一旦有多个线程都获取到了锁并进入到函数第一个线程刚判断完instance == null
* CPU就被另一线程占用此时判断instance任然等于null,这种情况下就会创建成两个实例而不是单例,并且效率比较低
*/
public static synchronized SingletonDemo1 getInstance(){
if(instance == null){
instance = new SingletonDemo1();
}
return instance;
}
}
案例代码二
package jv.test;
public class SingletonDemo2 {
private static SingletonDemo2 instance;
private SingletonDemo2(){
}
/**
* 双重检测的线程安全的单例设计
* @return
*/
public static SingletonDemo2 getInstance(){
if(instance ==null){
synchronized (SingletonDemo2.class){
if (instance ==null){
instance = new SingletonDemo2();
}
}
}
return instance;
}
}
2、饿汉式
饿汉式生而线程安全,但是由于一开始就创建了实例,因此相较懒汉式在用到时在创建实例要费内存。
package jv.test;
public class SingletonDemo3 {
private static SingletonDemo3 instance = new SingletonDemo3();
private SingletonDemo3(){
}
/**
* 这个在多线程情况先也是安全的因为get方法只是获取前面已经建好的实例
* @return
*/
public static SingletonDemo3 getInstance(){
return instance;
}
}
3、静态类内部加载
package jv.test;
public class SingletonStaicDemo {
private static class SingleHolder{
private static SingletonStaicDemo instance = new SingletonStaicDemo();
}
private SingletonStaicDemo(){
}
public static SingletonStaicDemo getInstance(){
return SingleHolder.instance;
}
}