synchoronized是JVM的內置鎖,而lock是Java代碼實現的。lock是sync對的擴展,完全可以替代后者。lock可以重入,允許同一個線程連續多次獲得同一把鎖。其次,lock獨有的功能有:
1、可以響應中斷,sync要么獲得鎖執行,要么保持等待。而重入鎖可以響應中斷,使得線程在遲遲得不到鎖的情況下,不用再等待。主要由lockInterruptibly()實現,這是一個可以對中斷進行響應的鎖申請動作,鎖中斷可以避免死鎖。
2、鎖的申請可以有等待時限,用tryLock()可以實現限時等待,如果超時還未獲得鎖會返回false,也防止線程遲遲得不到鎖時一直等待,可以避免死鎖。
3、公平鎖,即鎖的獲得按照線程先來后到的順序依次獲得,不會產生飢餓現象。sync的鎖默認不公平,可通過傳入構造方法的參數實現公平鎖。
4、重入鎖可以綁定多個Condition條件,這些Condition通過調用await/singal實現線程間通信。