java中內置鎖synchronized和顯式鎖Lock在實現上完全不同,兩者沒有混合使用的辦法,不能保證數據安全。
我們都知道,java的synchronized機制,有一個鎖對象,在這個鎖對象上實現互斥的操作。默認的情況下,會使用當前對象或類實例作為鎖對象。我們也可以使用一個相同的鎖對象,對不同類的方法或代碼塊進行保護。
但是,Lock與synchronized的實現方式完全不同,Lock中并不像synchronized中存在互斥的鎖對象,而是使用了一個狀態計數器,并在嘗試獲取鎖時,使用樂觀鎖機制,調用CAS操作來重復嘗試獲取鎖。
所以,當我們混合使用synchronized和Lock時,實際上就是使用了兩把完全不同的鎖,相互沒有任何關系。