一.
/**
* @Name T00
* @Description 懒汉模式(线程安全,无法懒加载)
*/
public class T00 {
private final static T01 t01 = new T00();
private T00(){
//构造函数私有化,防止直接调用实例对象
}
public static T00 getInstace(){
return t00;
}
}
二.
/**
* @Name T01
* @Description 懒汉模式二(线程安全,无法懒加载,可以在static代码块加载一些方法或配置)
*/
public class T01 {
private final static T01 t01;
static {
//do some thing
t= new T01();
}
private T01(){
//构造函数私有化,防止直接调用实例对象
}
public static T01 getInstace(){
return T01.t01;
}
}
三.
3-1.
/**
* @Name T02
* @Description 饿汉模式(线程不安全)
*/
public class T02 {
private static T02 t02;
private T02(){
//构造函数私有化,防止直接调用实例对象
}
public static T02 getInstace(){
if(t02 == null){
t02 = new T02();
}
return t02;
}
}
3-2.
/**
* @Name T03
* @Description 饿汉模式(线程安全,效率不高)
*/
public class T03 {
private static T03 t03;
private T03(){
//构造函数私有化,防止直接调用实例对象
}
public synchronized static T03 getInstace(){
if(t03 == null){
t03 = new T03();
}
return t03;
}
}
四.
4-1.
/**
* @Name T04
* @Description 饿汉模式(线程安全,效率比T03高,
* 但jvm虚拟机重排序(jvm编译或运行时为提高代码执行效率会使代码重排序),可能会出现线程安全问题
*/
public class T04 {
private static T04 t04;
private T04(){
//构造函数私有化,防止直接调用实例对象
}
public static T04 getInstace(){
if(t04 == null){
synchronized(T04.class){
if(null == t04) {
t04 = new T04();
}
}
}
return t04;
}
}
4-2.
/**
* @Name T04_1
* @Description 饿汉模式(线程安全,效率比T03高)
* 加入 volatile 关键字,阻止jvm重排序,但影响效率
*
* 补充;1.volatile关键字作用:
* 1.使(java内存模型)内存可见,
* 2.阻止jvm虚拟机对代码重排序
*/
public class T04_1 {
private volatile static T04_1 t04;
private T04_1(){
//构造函数私有化,防止直接调用实例对象
}
public static T04_1 getInstace(){
if(t04 == null){
synchronized(T04_1.class){
if(null == t04) {
t04 = new T04_1();
}
}
}
return t04;
}
}
五.
/**
* @Name T05
* @Description 内部类(线程安全,可以懒加载)
*/
public class T05 {
private T05(){
//构造函数私有化,防止直接调用实例对象
}
private static class Singleton{
public static final T05 t05 = new T05();
}
public static T05 getInstace(){
return Singleton.t05;
}
}
六.
/**
* @Name T06
* @Description 内部枚举(线程安全,可以懒加载,从底层防止了反序列化破解的可能)
*/
public class T06 {
private T06(){
//构造函数私有化,防止直接调用实例对象
}
private enum Singleton{
INSTANCE;
private final T06 t06;
Singleton(){
t06 = new T06();
}
}
public static T06 getInstace(){
return Singleton.INSTANCE.t06;
}
}
