目錄
一、調度(四)
1.隨機調度大環境
二、鎖(二)
1.位置
2.無鎖阻塞
3.重入鎖
4.連續鎖
4.1措施
三、線程方法(二)
1.wait
2.notify
3.wait-notify指位后移
3.1可能時再檢查
3.1.1join(二)
3.1.1.1可能時再檢查死亡
四、單例模式
1.實現
1.1private構造器
1.2一次一個
1.3靜態存儲
2.樣式
2.1餓漢模式
2.2懶漢模式
一、調度(四)
1.隨機調度大環境
隨機調度大環境 里面有 鎖競爭阻塞,里面又有 代碼塊的競鎖能力
二、鎖(二)
1.位置
鎖只在競爭中 跳躍存在著
2.無鎖阻塞
競爭無鎖處 被鎖阻塞著
3.重入鎖
線程重入鎖時 處運行態、其它代碼塊被鎖阻塞 無競爭 能高效地獲取鎖
4.連續鎖
線程連續競同鎖 會因上把鎖出時 還處運行態 較其他同鎖競爭線程的 阻塞剛喚醒態 容易連續調度 去競爭到同鎖
4.1措施
可在上把鎖 用wait后移 消除連續調度競爭 而避免造成 線程餓死
三、線程方法(二)
1.wait
鎖的wait方法 對身競爭代碼塊 停位地 封印其競鎖能力,便也失去了鎖,處于無法參與競爭的 永阻塞狀態
- wait(時間)設置最長等待時間后自動喚醒
2.notify
鎖的notify方法 對異競爭代碼塊 續位地 恢復其競鎖能力,在瞬時間內 處回可參與競爭的 現阻塞狀態
- notify 隨機喚醒一個此鎖wait線程,notifyAll 喚醒所有此鎖wait線程
3.wait-notify指位后移
鎖的wait方法 將身線程wait后部分 阻塞往后放到 異線程鎖noity方法的后面,應用案例:
3.1可能時再檢查
循環連續的wait阻塞 等著只為每次可能情況時 再notify對接 來喚醒檢查一下,提高了檢查的情況針對性
3.1.1join(二)
join使當前線程 執行卡在該方法 直到該線程實例的系統線程死亡 才執行完退出來,將當前線程后部分 阻塞往后放到 目標系統線程死亡的后面
3.1.1.1可能時再檢查死亡
系統線程銷毀死亡后,對應的線程實例 會自動調用notifyAll,所以就可以針對線程實例notify時 才對線程進行死亡檢查:
public final synchronized void join(long millis) throws InterruptedException {while (this.isAlive()) {wait(millis);}
}
四、單例模式
1.實現
1.1private構造器
private向外 封閉構造器 無法外部創建實例
1.2一次一個
內部只創建一次一個
1.3靜態存儲
放靜態中 外部才可 對類的僅靜態取出
2.樣式
2.1餓漢模式
必創建地 類加載時就創建實例:
class SingletonHungry {private static SingletonHungry instance = new SingletonHungry();//static靜態存儲,只有類加載時的創建一次一個private SingletonHungry() {}//private封閉構造器public static SingletonHungry getInstance() {//封裝好獲取return instance;}
}
2.2懶漢模式
需要時 才調用接口去創建實例:
class SingletonLazy {private static SingletonLazy instance = null;//static靜態存儲private SingletonLazy() {}//private封閉構造器public static SingletonLazy getInstance() {if (instance == null) { //優化時 線程不加鎖能過(只讀)情況 就拎開 少加點鎖 分開處理掉synchronized (SingletonLazy.class) {//寫的這塊范圍內 線程安全問題保障:if (instance == null) {//->連續讀取instance的null時,兩次沒有前后影響到 都讀為null 都去創建實例instance = new SingletonLazy();}return instance;}}return instance;}
}
?