synchronized是針對對象的隱式鎖使用的,注意是對象!
舉個小例子,該例子沒有任何業務含義,只是為了說明synchronized的基本用法:
總結:
synchronized是針對對象的隱式鎖使用的!
修飾實例方法時,競爭實例對象鎖。
修飾靜態方法時,競爭類對象鎖。
修飾代碼塊時,競爭參數對象鎖。
鎖是不能被繼承的。
wait()/notify():調用任意對象的 wait() 方法導致線程阻塞,並且該對象上的鎖被釋放。而調用任意對象的notify()方法則導致因調用該對象的
wait() 方法而阻塞的線程中隨機選擇的一個解除阻塞(但要等到獲得鎖後才真正可執行)。
有synchronized的地方不一定有wait,notify
有wait,notify的地方必有synchronized.這是因為wait和notify不是屬於線程類,而是每一個對象都具有的方法(事實上,這兩個方法是Object類裡的),而且,這兩個方法都和對象鎖有關,有鎖的地方,必有synchronized。
與ReentrantLock對比:
1.lock可以有多個條件,synchronized只有一個
2.synchronized不可中斷,lock可以,也能設置超時
3.lock需要手動釋放鎖
4.lcok在競爭激烈時,並發性能更好。synchronized在不激烈時,由於JVM優化,性能更好些。輕量鎖、偏向鎖、鎖消除等。