java多執行緒設計模式
2 start方法執行有2個步驟
啟動新的執行緒
執行new物件的run方法
3 所有執行緒結束,程式結束。 主執行緒可以先結束,但並不表示程式結束。
4 一個執行緒已經獲得鎖定,其他執行緒都不能執行該例項的synchronized方法。
5 wait set 執行緒休息區,當執行緒呼叫wait()方法時,執行緒自動進入wait set 區等待,直到被喚醒。
6 wait notify notifyAll方法都是在鎖定時呼叫,喚醒的執行緒重新等待鎖。並且都有物件obj.wait(),否則預設this.wait()
7 執行緒好壞評判標準
安全性和生存性為必考慮
安全性 ---不損壞物件
生存性 ---進行必要處理 , 防止執行緒掛掉
複用性 ---可在利用類
效能 ---能快速、大量的進行處理
吞吐量越大、響應性越快、容量越大,效能越好
8 可能發生死鎖的3個條件
a、具有多個sharedResourse參與者,即共享資源
b、執行緒鎖定一個sharedSourse時,還沒解除前就去鎖定另一個sharedSourse.
c、獲取sharedSourse的順序不固定
只要破壞a b c中的任意一個條件,就可以避免死鎖的發生。
9 臨界區的大小與執行效能
獲取鎖定需要花時間
執行緒衝突時必須等待
10 有鎖定時一定要記得解鎖,中間不能有return 或是異常。
11 要線上程中共享long 和 double 的欄位,必須在synchronized中操作,或是宣告成volatile
12 Immutable Thread(不可變執行緒)
欄位為 final私有
沒有setter方法
優點:不需要synchronized欄位,頻繁訪問的情況下可以大大提高效能。
13 被阻擋而等待
等待
while(!ready){
wait();
}
喚醒
ready=true;
notify()/notifyAll()
14 ReadWriteLock
Read Read 不衝突
Read Write 衝突
Write Write 衝突
15 程序與執行緒的區別
a 程序的記憶體是獨立的、執行緒的記憶體是共享的
b
16 interrupt() 方法會喚醒sleep/wait/join ,但會直接到catch語句,而不是執行其後面的語句。
17 join()等待執行緒結束
疑問:
1 同一個類中,2個方法用了synchronized, 呼叫其中的一個方法,另一個方法也被鎖住了?
答:是
1、多核、多CPU執行緒
Lock
lock.lockInterruptibly(),其實和lock.lock()效果一樣,只有當呼叫interrupt()方法時,前面的會先執行catch裡程式碼。
Condition
Timer
TimerTask
Callable<V>
2 WeakReference弱引用,防止記憶體洩露,將弱引用物件佔用空間釋放。
3 Futrue<V> FutrueTask<V>
4 JAVA netive關鍵字
native關鍵字說明其修飾的方法是一個原生態方法,方法對應的實現不是在當前檔案,而是在用其他語言(如C和C++)實現的檔案中。
Java語言本身不能對作業系統底層進行訪問和操作,但是可以通過JNI介面呼叫其他語言來實現對底層的訪問。
5 public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
a.當執行緒池小於corePoolSize時,新提交任務將建立一個新執行緒執行任務,即使此時執行緒池中存在空閒執行緒。
b.當執行緒池達到corePoolSize時,新提交任務將被放入workQueue中,等待執行緒池中任務排程執行
c.當workQueue已滿,且maximumPoolSize>corePoolSize時,新提交任務會建立新執行緒執行任務
d.當提交任務數超過maximumPoolSize時,新提交任務由RejectedExecutionHandler處理
e.當執行緒池中超過corePoolSize執行緒,空閒時間達到keepAliveTime時,關閉空閒執行緒
f.當設定allowCoreThreadTimeOut(true)時,執行緒池中corePoolSize執行緒空閒時間達到keepAliveTime也將關閉