【java】單例設計模式——餓漢式和懶漢式、Runtime、Timer

love_Aym發表於2018-04-17

單例設計模式:保證類在記憶體中只有一個物件

一、餓漢式:

1、私有構造方法:外界就不能建立物件

2、建立本類物件

3、對外提供公共的訪問方法

class Singleton {
	//1,私有構造方法,其他類不能訪問該構造方法了
	private Singleton(){}
	//2,建立本類物件
	private static Singleton s = new Singleton();
	//3,對外提供公共的訪問方法
	public static Singleton getInstance() {				//獲取例項
		return s;
	}
}

二、懶漢式:

1、私有構造方法:外界就不能建立物件

2、宣告一個引用

3、對外提供公共的訪問方法,建立物件

特點:

1、開發時不用:不安全,多執行緒時可能會建立多個物件

2、面試時用:單例的延遲載入模式

/*
 * 懶漢式,單例的延遲載入模式
 */
/*class Singleton {
	//1,私有構造方法,其他類不能訪問該構造方法了
	private Singleton(){}
	//2,宣告一個引用
	private static Singleton s ;
	//3,對外提供公共的訪問方法
	public static Singleton getInstance() {				//獲取例項
		if(s == null) {
			//執行緒1等待,執行緒2等待
			s = new Singleton();
		}		
		return s;
	}
}

三、餓漢式和懶漢式的區別

1、餓漢式是空間換時間,一上來就建立物件佔用了空間,但是時間快,懶漢式是時間換空間,上來先宣告一個引用,然後進行判斷浪費了時間

2、在多執行緒訪問時,餓漢式不會建立多個物件,而懶漢式有可能會建立多個物件


四、第三種單例模式

class Singleton {
	//1,私有構造方法,其他類不能訪問該構造方法了
	private Singleton(){}
	//2,宣告一個引用
	public static final Singleton s = new Singleton();	
}

五、單例模式舉例

1、Runtime類:每個java應用程式都有一個Runtime類例項,使應用程式能夠與其執行的環境相連線。應用程式不能建立自己的Runtime類例項。

可以通過 getRuntimr() 方法返回與當前Java應用程式相關的執行時物件 。

原始碼:

private static Runtime currentRuntime = newRuntime();
public static Runtime getRuntime() {
       return currentRuntime;
    }
private Runtime() {}

補充:Timer類:一種工具,執行緒用其安排以後在後臺執行緒中執行的任務,可安排任務執行一次,或者定期重複執行。

void schedule(TimerTask task, Date time):安排在制定的時間執行制定的任務。

void schedule(TimerTask task, Date time,long period):重複的固定延遲執行

    TimerTask類:由Timer安排為一次執行或重複執行的任務,裡面有run()方法,放置具體執行任務。

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class Demo3_Timer {
	/**
	 * @param args
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws InterruptedException {
		Timer t = new Timer();
		//在指定時間安排指定任務
		//第一個引數,是安排的任務,第二個引數是執行的時間,第三個引數是過多長時間再重複執行
		t.schedule(new MyTimerTask(), new Date(188, 6, 1, 14, 22, 50),3000);	
		
		while(true) {
			Thread.sleep(1000);
			System.out.println(new Date());
		}
	}
}

class MyTimerTask extends TimerTask {
	@Override
	public void run() {
		System.out.println("起床背英語單詞");
	}
}



相關文章