Java執行緒相關

2021-05-23 11:40:43 字數 1894 閱讀 5330

今天主要是了解了一些執行緒的相關執行狀態,其中執行緒的同步是個比較讓人困惑的地方。

我們知道執行緒的同步有兩種方法,一是用

synchronized

修飾方法;二是使用

synchronized

(object){}

同步塊;這裡涉及到乙個監視器物件。因為二者同步的首要條件就是處於同一監視器物件下才能實現同步。

難點就是怎麼才能處於同一監視器物件之下呢,首先是

synchronized

修飾方法則要求執行緒是同一物件的執行緒。而如果是

synchronized

(object){}

同步塊則要求同步塊的括號中的同步塊物件

object

相同,比如

object

用同一字串物件,或者用靜態的物件,或者使用類模板如

object.class

。下面是關於這部分網上的一些摘抄:

1  wait

方法:該方法屬於

object

的方法,

wait

方法的作用是使得當前呼叫

wait

方法所在部分(**塊)的執行緒停止執行,並釋放當前獲得的呼叫

wait

所在的**塊的鎖,並在其他執行緒呼叫

notify

或者notifyall

方法時恢復到競爭鎖狀態(一旦獲得鎖就恢復執行)。

呼叫wait

方法需要注意幾點:

第一點:

wait

被呼叫的時候必須在擁有鎖(即

synchronized

修飾的)的**塊中。

第二點:恢復執行後,從

wait

的下一條語句開始執行,因而

wait

方法總是應當在

while

迴圈中呼叫,以免出現恢復執行後繼續執行的條件不滿足卻繼續執行的情況。

第三點:若

wait

方法引數中帶時間,則除了

notify

和notifyall

被呼叫能啟用處於

wait

狀態(等待狀態)的執行緒進入鎖競爭外,在其他執行緒中

interrupt

它或者引數時間到了之後,該執行緒也將被啟用到競爭狀態。

第四點:

wait

方法被呼叫的執行緒必須獲得之前執行到

wait

時釋放掉的鎖重新獲得才能夠恢復執行。

2  notify

方法和notifyall

方法:notify

方法通知呼叫了

wait

方法,但是尚未啟用的乙個執行緒進入執行緒排程佇列(即進入鎖競爭),注意不是立即執行。並且具體是哪乙個執行緒不能保證。另外一點就是被喚醒的這個執行緒一定是在等待

wait

所釋放的鎖。

notifyall

方法則喚醒所有呼叫了

wait

方法,尚未啟用的程序進入競爭佇列。

3 synchronized

關鍵字:

第一點:

synchronized

用來標識乙個普通方法時,表示乙個執行緒要執行該方法,必須取得該方法所在的物件的鎖。

第二點:

synchronized

用來標識乙個靜態方法時,表示乙個執行緒要執行該方法,必須獲得該方法所在的類的類鎖。

第三點:

synchronized

修飾乙個**塊。類似這樣:

synchronized(obj)

。表示乙個執行緒要執行該**塊,必須獲得

obj的鎖。這樣做的目的是減小鎖的粒度,保證當不同塊所需的鎖不衝突時不用對整個物件加鎖。利用零長度的

byte

陣列物件做

obj非常經濟。

java執行緒相關問題1

一.thread.sleep 1.thread.sleep 函式就是幹這種事的,他告訴作業系統 在未來的多少毫秒內我不參與cpu競爭 2.而thread.sleep 0 的作用,就是 觸發作業系統立刻重新進行一次cpu競爭 競爭 的結果也許是當前執行緒仍然獲得cpu控制權,也許會換成別的執行緒獲得c...

關於java 執行緒池相關

public class test threadpooltaskexecutor executor new threadpooltaskexecutor 配置核心執行緒數 executor.setcorepoolsize corecount 配置最大執行緒數 executor.setmaxpools...

java的執行緒 鎖相關

volatitle 這樣的一行 volatitle instance new singleton instance是volatile變數彙編後 是這樣子的 0x01a3de1d movb 0 0,0 1104800 esi 0x01a3de24 lock addl 0 0,esp 當中有個lock指...