public class SingletonDemo01 {
/**
* 加載時就把對象創建出來--餓漢式
* 類初始化時天然的是線程安全的
*/
private static SingletonDemo01 instance=new SingletonDemo01();
private SingletonDemo01(){
}
//方法沒有同步,調用效率高
public static SingletonDemo01 getInstance(){
return instance;
}
}
public class SingletonDemo02 {
/**
* 加載時就不把對象創建出來--懶漢式
* 類初始化時天然的是線程安全的
*/
private static SingletonDemo02 instance;
private SingletonDemo02(){
}
//方法同步,並發效率低(如果不同步,並發量高的時候可能創建多個對象)
public static synchronized SingletonDemo02 getInstance(){
if(instance==null){
instance=new SingletonDemo02();
}
return instance;
}
}
public class SingletonDemo03 {
private static SingletonDemo03 instance=null;
private SingletonDemo03(){
}
public static SingletonDemo03 getInstance(){
if(instance==null){
SingletonDemo03 ins;
synchronized (SingletonDemo03.class) {
ins=instance;
if(ins==null){
synchronized (SingletonDemo03.class) {
if(ins==null){
ins=new SingletonDemo03();
}
}
instance=ins;
}
}
}
return instance;
}
}
public class SingletonDemo04 {
private SingletonDemo04(){
}
//類加載的方式天然線程安全
private static class Singleton04ClassInStance{
//不存在同步問題,效率高
private static final SingletonDemo04 instance=new SingletonDemo04();
}
//調用的時候才去加載,延遲加載實現
public static SingletonDemo04 getInstance(){
return Singleton04ClassInStance.instance;
}
}
public enum SingletonDemo05 {
/**
* 這個枚舉元素本身就是單例
*/
INSTANCE;
/**
* 還可以添加自己需要的操作
*/
public void singletonOpt(){
}
}
--主要:
① 餓漢式:線程安全,調用效率高,不可以延遲加載
② 懶漢式:線程安全,調用效率不高,可以延遲加載
-- 其他:
③ 雙重鎖:JVM底層內部模型原因,偶爾會出問題,不建議使用
④ 靜態內部類:線程安全,調用效率高,可以延遲加載
⑤ 枚舉式:線程安全,調用效率高,不可延遲加載。並且可以天然的防止反射和反序列化漏洞。