概念
- java中單例模式是一種常見的設(shè)計(jì)模式,單例模式的寫法有好幾種.這里主要介紹:懶漢式 餓漢式.
單例模式有以下特點(diǎn):
- 單例類必須只能有一個(gè)實(shí)例.
- 單例類必須自己創(chuàng)建自己的唯一實(shí)例.
- 單例類必須給所有其他對(duì)象提供這一實(shí)例.
單例的好處
- 當(dāng)一個(gè)對(duì)象在程序內(nèi)部只能有一個(gè)實(shí)例的時(shí)候,它可以保證我們不會(huì)重復(fù)創(chuàng)建,而是始終指向同一個(gè)對(duì)象.
- 對(duì)象的盛名周期是整個(gè)項(xiàng)目運(yùn)行期間.
//單例
public class Test1 {
public static void main(String[] args) {
Person p = Person.getInstance();
Person p1 = Person.getInstance();
}
}
//d單例:在程序在運(yùn)行期間不管通過(guò)什么途徑,執(zhí)行創(chuàng)建一個(gè)對(duì)象
//對(duì)象的生命周期是整個(gè)項(xiàng)目運(yùn)行期間
class Person{//餓漢式單例模式
//static
static Person person = new Person();
static Person getInstance(){//靜態(tài)工廠的方法
return person;
}
}
class Student {//懶漢式單例模型
//volatile每個(gè)線程都有自己的棧
volatile static Student stu = null;
static Student getInstance(){
synchronized (Student.class) {
if (stu == null) {
stu = new Student();
}
}
return stu;
}
}
在上述代碼中Person類是一開始就創(chuàng)建了空間,屬于餓漢式單例模式.
- 優(yōu)點(diǎn):在類加載初期就創(chuàng)建對(duì)象,調(diào)用getInstance的時(shí)候,沒(méi)有同步方法,運(yùn)行時(shí)性能較高.
- 缺點(diǎn):類加載速度慢,占用太多的資源空間.
而Student是在用的時(shí)候創(chuàng)建空間,屬于懶漢式單例模型 - 優(yōu)點(diǎn): 避免了第一種方法的缺點(diǎn),同時(shí),可以在多線程下運(yùn)行安全.
- 缺點(diǎn):因?yàn)槭褂昧随i,在運(yùn)行中效率慢.
volatile關(guān)鍵字是起到雙重保障的作用.