下午對執行緒之間通訊有了新的理解:
這裡只討論synchronized 修飾 方法的情況,當然也分為兩種情況:
1.修飾普通方法
2.修飾靜態方法
下面先討論修飾普通方法的情況,當synchronized修飾方法的時候,這個物件會被上鎖,就是說,不光是當前被synchronized修飾的方法不能被其他執行緒鎖訪問,這個物件的其他被synchronized修飾的方法也不能被其他執行緒訪問(經測試,非synchronized可以被其他執行緒訪問),好,那麼現在,什麼情況下,這個鎖會被釋放呢,我目前經過測試有以下情況:
1.當前方法執行完畢或出現異常;
2.當前方法呼叫wait()方法
那麼什麼情況下用notify(notifyall)方法呢,當有乙個執行緒呼叫wait()方法等待喚醒時,如果不呼叫notify,呼叫wait()方法的執行緒將一直處於等待狀態,jvm也將不會終止,所以wait 是和 notify 配套使用的,當呼叫wait(),必須呼叫nofify()或notifyall方法喚醒。
執行緒獲得鎖的三種方式:
1.通過執行synchronized方法
2.執行synchronized**塊
3.執行靜態synchronized方法,這是屬於類級別,不是物件級別的了
notify和notifyall的區別:
notify只喚醒乙個等待的執行緒,而notifyall則喚醒所有等待的執行緒,這些執行緒再競爭鎖,也就是說,notify的競爭階段發生在喚醒,只要喚醒了,就有獲得鎖的機會,而notifyall競爭發生在獲取鎖的階段
關於synchronized失效wenti
國慶前公司的 做了一波活動,導致平時流水五六千的 在9月30日的一天流水暴漲到近40w,隨之而來的就是一波大坑。簡單介紹一下業務場景,乙個 系統,乙個發碼系統。是賣電子券的,使用者在 購買卡券,系統就會呼叫發碼系統給客戶進行發碼 簡訊形式 然後把傳送的碼返回給 系統存入卡包。我們有部分 的券碼是購買...
synchronized和volatile的區別?
一旦乙個共享變數 類的成員變數 類的靜態成員變數 被volatile修飾之後,那麼就具備了兩層語義 1 保證了不同執行緒對這個變數進行操作時的可見性,即乙個執行緒修改了某個變數的值,這新值對其他執行緒來說是 立即可見的。2 禁止進行指令重排序。volatile本質是在告訴jvm當前變數在暫存器 工作...
synchronized和volatile的區別
volatile關鍵字的本質是告訴jvm,該變數在暫存器中的值是不確定的,需要在主存中讀取,而synchronized關鍵字是鎖住當前變數,只有當前執行緒可以訪問,其他執行緒等待。volatile關鍵字的作用 保證變數的可見性和防止指令重排序。1.volatile只能作用於變數,而synchroni...