1、什么是單例模式?
Java單例模式是一種設計模式,用于確保一個類只有一個實例,并提供全局訪問點以獲取該實例。它通常用于需要共享資源或控制某些共享狀態(tài)的情況下。
2、實現方式
懶漢式:在類加載的時候就創(chuàng)建對象,要再調用方法時才創(chuàng)建對象,減少內存開銷。
餓漢式:再類加載的時候就實例化對象。
2.1 同步方法調用創(chuàng)建實例(懶漢式)
當剛加載這個類時不會直接初始化person,只有調用getPerson()方法時才會構建唯一實例。
public class Person {
private static Person person;
//將構造器私有化,就無法從外部調用構造器構造對象
private Person(){}
//此時這個synchronized是保證線程安全
public synchronized static Person getPerson() {
if (person == null) {
person = new Person();
}
return person;
}
}
2.1 雙重校驗鎖方式加載對象實例(懶漢式)
用兩個判斷,在第一個判斷不通過時,我們不用同步代碼塊,直接返回結果
public class Person {
//此時要用volatile用于保證person = new Person()內部指令不排序
private volatile static Person person;
//將構造器私有化,就無法從外部調用構造器構造對象
private Person(){}
public static Person getPerson() {
if (person ==null){
synchronized (Person.class){
if (person == null){
person = new Person();
}
}
}
return person;
}
}
2.1 靜態(tài)變量加載對象實例(餓漢式)
對象唯一實例會隨著這個類的加載就會被初始化出來,基于 classloader 機制避免了多線程的同步問題,但它再還沒有使用這個對象時就被加載出來,有點浪費內存空間。
public class Person {
private static Person person = new Person();
//將構造器私有化,就無法從外部調用構造器構造對象
private Person(){}
public static Person getPerson() {
return person;
}
}
2.1 靜態(tài)內部類實現單例模式(懶漢式)
這里用到了一個知識點,就是內部類不會隨著外部類的加載而加載,而是再第一次使用到內部類后再加載初始化內部類。這樣的機制實現了懶漢模式。我們使用了final修飾,也將其確定為單例模式。
public class Person {
private static class PersonHolder {
private static final Person INSTANCE = new Person();
}
//將構造器私有化,就無法從外部調用構造器構造對象
private Person (){}
public static final Person getInstance() {
return PersonHolder.INSTANCE;
}
}
2.1 枚舉實現單例模式(餓漢式)
這是實現單例模式的最佳方法。它更簡潔,自動支持序列化機制,絕對防止多次實例化。這是實現單例模式的最佳方法。它更簡潔,自動支持序列化機制,絕對防止多次實例化。文章來源:http://www.zghlxwxcb.cn/news/detail-859993.html
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}
完整的枚舉單例文章來源地址http://www.zghlxwxcb.cn/news/detail-859993.html
public class User {
//私有化構造函數
private User(){ }
//定義一個靜態(tài)枚舉類
static enum SingletonEnum{
//創(chuàng)建一個枚舉對象,該對象天生為單例
INSTANCE;
private User user;
//私有化枚舉的構造函數
private SingletonEnum(){
user=new User();
}
public User getInstnce(){
return user;
}
}
//對外暴露一個獲取User對象的靜態(tài)方法
public static User getInstance(){
return SingletonEnum.INSTANCE.getInstnce();
}
}
public class Test {
public static void main(String [] args){
System.out.println(User.getInstance());
System.out.println(User.getInstance());
System.out.println(User.getInstance()==User.getInstance());
}
}
結果為true
到了這里,關于Java單例模式的五種實現方式 懶漢式 餓漢式 雙重校驗鎖 靜態(tài)變量 靜態(tài)內部類 枚舉實現單例模式等的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!