今天主要是了解了一些執行緒的相關執行狀態,其中執行緒的同步是個比較讓人困惑的地方。
我們知道執行緒的同步有兩種方法,一是用
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指...