單例模式的典型特征:
- 隻有一個執行個體;
- 構造器私有,禁止外部直接使用 new 來建立對象;
- 對外提供擷取執行個體的方法;
餓漢式單例:類一建立就直接 new 一個對象。
簡單了解就是,很餓,食物一做好就吃(類一建立就new對象)。
好處:立即建立,線程安全。
不足:建立的時候占用記憶體資源,後期沒使用的話就造成資源浪費了。
package single;
import java.util.Arrays;
//餓漢式單例
public class Hungary {
/**
* 餓漢式,類加載的時候就直接 new 一個,
* 占用記憶體空間
* */
private static Hungary hungary = new Hungary();
//構造器私有
private Hungary(){
System.out.println(Thread.currentThread().getName() + ", " + toString());
}
public static Hungary getInstance(){
return hungary;
}
}
驗證下:
1.單線程:
package single;
import java.util.Arrays;
//餓漢式單例
public class Hungary {
/**
* 餓漢式,類加載的時候就直接 new 一個,
* 占用記憶體空間
* */
private static Hungary hungary = new Hungary();
//構造器私有
private Hungary(){
System.out.println(Thread.currentThread().getName() + ", " + toString());
}
public static Hungary getInstance(){
return hungary;
}
public static void main(String[] args) {
//單線程
for (int i = 0; i < 5; i++){
Hungary.getInstance();
}
//多線程
/*for (int i = 0; i < 5; i++){
new Thread(new Runnable() {
@Override
public void run() {
Hungary.getInstance();
}
}).start();
}*/
}
}
運作結果:
main, [email protected]
2.多線程
package single;
import java.util.Arrays;
//餓漢式單例
public class Hungary {
/**
* 餓漢式,類加載的時候就直接 new 一個,
* 占用記憶體空間
* */
private static Hungary hungary = new Hungary();
//構造器私有
private Hungary(){
System.out.println(Thread.currentThread().getName() + ", " + toString());
}
public static Hungary getInstance(){
return hungary;
}
public static void main(String[] args) {
//多線程
for (int i = 0; i < 5; i++){
new Thread(new Runnable() {
@Override
public void run() {
Hungary.getInstance();
}
}).start();
}
}
}
運作結果:
main, [email protected]